¿Es una práctica buena / mala / aceptable pasar el objeto actual en una llamada a un método? Como en:
public class Bar{
public Bar(){}
public void foo(Baz baz){
// modify some values of baz
}
}
public class Baz{
//constructor omitted
public void method(){
Bar bar = new Bar();
bar.foo(this);
}
}
Específicamente, ¿es bar.foo(this)aceptable la línea ?

Respuestas:
No hay razón para no usarlo,
thises la instancia actual y su uso es perfectamente legítimo. De hecho, a menudo no existe una forma clara de omitirlo.Así que úsalo.
Como es difícil convencer de que es aceptable sin un ejemplo (una respuesta negativa a esa pregunta siempre es más fácil de argumentar), acabo de abrir una de las
java.langclases más comunes , laStringúnica, y por supuesto encontré casos de este uso, por ejemploBusque
(thisen grandes proyectos "aceptados", no dejará de encontrarlo.fuente
thisno significa que agregue un enlace bidireccional, debido a la herencia y las interfaces, por ejemplo.No hay nada de malo en eso. Lo que NO es una buena práctica es hacer lo mismo dentro de los constructores, porque daría una referencia a un objeto que aún no está completamente inicializado.
Hay una especie de publicación similar aquí: Java filtrando esto en el constructor donde dan una explicación de por qué esta última es una mala práctica.
fuente
Carconstructor puede crearWheelinstancias, unCarsinWheelse inicializaría de forma incompleta, mientras que unWheelsin un correspondienteCartambién se inicializaría de forma incompleta. En este caso, puede ser aceptable en el constructor del automóvil pasarthisal constructor de la rueda. La otra alternativa sería hacer que tanto el automóvil como la rueda tengan un constructor privado y usar una función de fábrica que construya el automóvil, la rueda e instale la rueda en el automóvil; pero ¿debería ser un método estático en el automóvil o un método estático en la rueda?CarFactoryWheelInstallerProxyque instale las ruedas por ti.Wheelestá completamente subordinado aCar, y la OMI no debería saberloCaren absoluto.thisdesde dentro de un constructor es sithisse pasa a un método o contexto desde el cual la referencia del objeto aún no completamente construido se publica para clientes desconocidos o no confiables (o código de cliente que asume que tiene una vista a un objeto completamente construido). Pasarthisde un constructor a un método de paquete privado que realiza una inicialización común es, en mi opinión, no solo aceptable sino deseable.Sí , pero debes tener cuidado con dos cosas
fuente
this. Hacer eso hubiera sido imposible si el objeto no hubiera sido asignado.Es perfectamente normal y perfectamente aceptable.
fuente
esto representa el objeto actual. Lo que está haciendo es sistemáticamente correcto, pero no veo la necesidad de esto si está llamando al método en la misma clase.
fuente
thisentre las dos clases. Por lo tanto, no es necesario agregar complejidad adicional.Es una mala práctica pasar el objeto actual en una llamada a un método si existen alternativas menos complejas para lograr el mismo comportamiento.
Por definición, una asociación bidireccional se crea tan pronto como
thisse pasa de un objeto a otro.Para citar Refactoring, de Martin Fowler:
Entonces, teóricamente, deberíamos escuchar las alarmas cuando nos damos cuenta de que necesitamos aprobar
thisy esforzarnos mucho para pensar en otras formas de resolver el problema en cuestión. Por supuesto, hay ocasiones en las que, como último recurso, tiene sentido hacerlo.Además, a menudo es necesario corromper su diseño temporalmente, haciendo 'cosas de malas prácticas', durante una refactorización a largo plazo de su código para una mejora general. (Un paso atrás, dos pasos adelante).
En la práctica, he descubierto que mi código ha mejorado enormemente al evitar los enlaces bidireccionales como la plaga.
fuente
thisse pasa.equalses Object. Esto es muy común: el método de recepción define su argumento como una clase más general o como una interfaz. Una de las razones por las que se utiliza este patrón en Java es para evitar dependencias no deseadas. Antes de continuar, le sugiero que eche un vistazo a las muchas ocurrencias de pasarthiscomo argumento en bibliotecas Java respetables.thismi código, siempre que sea posible. Recomendaría a otros que lo hicieran.Si. puede usarlo. Es común en la programación pasar.
thisPero hay pros y contras acerca de usarlo. Aún así, no es peligroso hacerlo.fuente
Solo para agregar un ejemplo más en el que pasar
thises correcto y sigue un buen diseño: Patrón de visitante . En el patrón de diseño de visitantes, el métodoaccept(Visitor v)generalmente se implementa de una manera que simplemente llamav.visit(this).fuente
Aceptable
Fragmento de documentos de Oracle JAVA:
fuente
thiscomo parámetro? ".this.some_variablepara referirse a la variable de clase en lugar de a una variable local. No tiene nada que ver con pasarthiscomo parámetro.Todo en Java se pasa por valor. ¡Pero los objetos NUNCA se pasan al método!
Cuando Java pasa un objeto a un método, primero hace una copia de una referencia al objeto, no una copia del objeto en sí. Por lo tanto, este es un método perfectamente utilizado en Java. Y el uso más seguido.
fuente
thisreferencia a un tipo primitivo y, por lo tanto, creo que su "más información" está introduciendo confusión.