¿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,
this
es 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.lang
clases más comunes , laString
única, y por supuesto encontré casos de este uso, por ejemploBusque
(this
en grandes proyectos "aceptados", no dejará de encontrarlo.fuente
this
no 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
Car
constructor puede crearWheel
instancias, unCar
sinWheel
se inicializaría de forma incompleta, mientras que unWheel
sin un correspondienteCar
también se inicializaría de forma incompleta. En este caso, puede ser aceptable en el constructor del automóvil pasarthis
al 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?CarFactoryWheelInstallerProxy
que instale las ruedas por ti.Wheel
está completamente subordinado aCar
, y la OMI no debería saberloCar
en absoluto.this
desde dentro de un constructor es sithis
se 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). Pasarthis
de 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
this
entre 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
this
se 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
this
y 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
this
se pasa.equals
es 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 pasarthis
como argumento en bibliotecas Java respetables.this
mi código, siempre que sea posible. Recomendaría a otros que lo hicieran.Si. puede usarlo. Es común en la programación pasar.
this
Pero 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
this
es 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
this
como parámetro? ".this.some_variable
para referirse a la variable de clase en lugar de a una variable local. No tiene nada que ver con pasarthis
como 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
this
referencia a un tipo primitivo y, por lo tanto, creo que su "más información" está introduciendo confusión.