Итак, я уже давно набрал навыки Java, и нашел несколько функциональных возможностей, о которых я раньше не знал. Инициализаторы статики и экземпляра - это два таких метода.
Мой вопрос в том, когда использовать инициализатор вместо того, чтобы включать код в конструктор? Я подумал о нескольких очевидных возможностях:
-
static/instance initializers могут использоваться для установки значения "final" static/экземпляров переменных, тогда как конструктор не может
-
статические инициализаторы могут использоваться для установки значения любых статических переменных в классе, которые должны быть более эффективными, чем наличие "if (someStaticVar == null)//do stuff" блока кода в начале каждого конструктора
Оба эти случая предполагают, что код, необходимый для установки этих переменных, более сложный, чем просто "var = value", поскольку в противном случае не было бы никакой причины использовать инициализатор вместо простой установки значения при объявлении переменная.
Однако, хотя это не тривиальные выигрыши (особенно способность устанавливать конечную переменную), похоже, что существует довольно ограниченное количество ситуаций, в которых должен использоваться инициализатор.
Конечно, можно использовать инициализатор для многого, что сделано в конструкторе, но я действительно не вижу причины для этого. Даже если все конструкторы для класса имеют большой объем кода, использование функции private initialize(), по-видимому, имеет для меня больше смысла, чем использование инициализатора, поскольку оно не блокирует вас, когда этот код запускается при написании нового конструктор.
Я что-то упустил? Есть ли ряд других ситуаций, в которых должен использоваться инициализатор? Или это действительно довольно ограниченный инструмент для использования в особых ситуациях?