Java утечка этого в конструкторе

Почему IDE жалуется на "утечку этого в конструкторе"? Я всегда предполагал, что это просто плохая практика. Но я на самом деле никогда не находил, почему это плохо.

Ответ 1

Утечка ссылки this в конструкторе (не контроллере) опасна, особенно в многопоточной среде. Это связано с тем, что объект не полностью сконструирован до тех пор, пока вызов конструктора не завершится. Таким образом, утечка this из конструктора означает, что внешний мир получает доступ к объекту, который еще не полностью сконструирован. Это может не обязательно приводить к проблемам в однопоточной программе (хотя это возможно, но проблема в этом случае гораздо более очевидна). Но если this просочится в другие потоки, они могут попытаться что-то сделать с объектом до завершения его построения, что приводит к тонким и трудным для поиска ошибкам.

Ответ 2

Существует мало абсолютов в жизни, например. вы должны платить налоги... или... смерть неизбежна. Но "передача this из конструктора всегда плохая" - это не один из них.

Оговорки, отмеченные Петром, все подходят и действительны. Было бы проблематично утечка this из конструктора в любой метод или контекст, в котором ссылка будет опубликована неизвестным или ненадежным клиентам. Пока еще плохо опубликовать ссылку для еще не полностью сконструированного объекта на любой клиентский код, доверенный или нет, который работает с предположением, что он будет иметь представление о действительном и согласованном объекте.

Тем не менее, нет ничего плохого в передаче this из конструктора в пакетно-закрытый метод, который выполняет обычную инициализацию, например, для группы объектов, которые имеют общий интерфейс, особенно если эта инициализация является длинной или комплекс.

TL; DR: Конечно, есть некоторые ситуации, в которых, на мой взгляд, не только приемлемо передавать this из конструктора, но и действительно желательно сделать это.