Java просочилась в конструктор

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

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам