method - Java filtrando esto en constructor
return java (2)
Esta pregunta ya tiene una respuesta aquí:
- Filtrando esto en el constructor de advertencia 10 respuestas
¿Por qué IDE se queja de "filtrar esto en el constructor"? Siempre he supuesto que es solo una mala práctica. Pero en realidad nunca encontré por qué es malo.
Filtrar this
referencia en el constructor (no en el controlador) es peligroso, especialmente en un entorno multiproceso. Esto se debe a que el objeto no está completamente construido hasta que finaliza la llamada al constructor. Filtrar this
del constructor significa que el mundo externo tiene acceso a un objeto que aún no está completamente construido. Esto puede no conducir necesariamente a problemas en un programa de subproceso único (aunque es posible, pero el problema es mucho más obvio en este caso). Pero si this
se filtra a otros hilos, en realidad pueden intentar hacer algo con el objeto antes de que se termine su construcción, lo que conduce a errores sutiles y difíciles de encontrar.
Hay pocos absolutos en la vida, ej. debe pagar impuestos ... o ... la muerte es inevitable. Pero "pasar this
de un constructor siempre es malo" es "no" uno de ellos.
Las advertencias señaladas por Peter son todas aptas y válidas. Sin duda sería problemático filtrar this
de un constructor a cualquier método o contexto en el que la referencia se publicaría a clientes desconocidos o que no son de confianza. Todavía es malo publicar una referencia para un objeto aún no construido completamente para cualquier código de cliente, de confianza o no, que opera bajo el supuesto de que tendrá una vista hacia un objeto válido y consistente.
Dicho esto, no hay absolutamente nada de malo en pasar this
de un constructor a un método privado de paquete que realiza una inicialización común en, por ejemplo, un grupo de objetos que comparten una interfaz común, particularmente si esa inicialización es larga o compleja.
TL; DR: Ciertamente, hay algunas situaciones en las que, en mi opinión, no solo es aceptable pasar this
de un constructor, sino realmente deseable hacerlo.