Почему IDE жалуется на "утечку этого в конструкторе"? Я всегда предполагал, что это просто плохая практика. Но я на самом деле никогда не находил, почему это плохо.
Java утечка этого в конструкторе
Ответ 1
Утечка ссылки this
в конструкторе (не контроллере) опасна, особенно в многопоточной среде. Это связано с тем, что объект не полностью сконструирован до тех пор, пока вызов конструктора не завершится. Таким образом, утечка this
из конструктора означает, что внешний мир получает доступ к объекту, который еще не полностью сконструирован. Это может не обязательно приводить к проблемам в однопоточной программе (хотя это возможно, но проблема в этом случае гораздо более очевидна). Но если this
просочится в другие потоки, они могут попытаться что-то сделать с объектом до завершения его построения, что приводит к тонким и трудным для поиска ошибкам.
Ответ 2
Существует мало абсолютов в жизни, например. вы должны платить налоги... или... смерть неизбежна. Но "передача this
из конструктора всегда плохая" - это не один из них.
Оговорки, отмеченные Петром, все подходят и действительны. Было бы проблематично утечка this
из конструктора в любой метод или контекст, в котором ссылка будет опубликована неизвестным или ненадежным клиентам. Пока еще плохо опубликовать ссылку для еще не полностью сконструированного объекта на любой клиентский код, доверенный или нет, который работает с предположением, что он будет иметь представление о действительном и согласованном объекте.
Тем не менее, нет ничего плохого в передаче this
из конструктора в пакетно-закрытый метод, который выполняет обычную инициализацию, например, для группы объектов, которые имеют общий интерфейс, особенно если эта инициализация является длинной или комплекс.
TL; DR: Конечно, есть некоторые ситуации, в которых, на мой взгляд, не только приемлемо передавать this
из конструктора, но и действительно желательно сделать это.