Java filtrando esto en constructor

¿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 progtwig 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.