Так что в последнее время я освежал свои навыки Java и нашел несколько функциональных возможностей, о которых раньше не знал. Статические инициализаторы и инициализаторы экземпляра - два таких метода.
У меня вопрос: когда можно использовать инициализатор вместо включения кода в конструктор? Я подумал о паре очевидных возможностей:
Инициализаторы static / instance могут использоваться для установки значения "final" переменных static / instance, тогда как конструктор не может
статические инициализаторы могут использоваться для установки значения любых статических переменных в классе, что должно быть более эффективным, чем наличие блока кода «if (someStaticVar == null) // do stuff» в начале каждого конструктора.
Оба этих случая предполагают, что код, необходимый для установки этих переменных, более сложен, чем просто «var = value», поскольку в противном случае не было бы никаких причин использовать инициализатор вместо простой установки значения при объявлении переменной.
Однако, хотя это не тривиальные преимущества (особенно возможность установить конечную переменную), кажется, что существует довольно ограниченное количество ситуаций, в которых следует использовать инициализатор.
Конечно, можно использовать инициализатор для многих вещей, которые выполняются в конструкторе, но я не вижу причин для этого. Даже если все конструкторы класса совместно используют большой объем кода, использование частной функции initialize () кажется мне более целесообразным, чем использование инициализатора, поскольку оно не блокирует выполнение этого кода при написании нового конструктор.
Я что-то упускаю? Есть ли еще ряд ситуаций, в которых следует использовать инициализатор? Или это действительно довольно ограниченный инструмент, который можно использовать в очень специфических ситуациях?
private final int somevar; {somevar = 2;}
(обратите внимание, без конструктора.) Для большего удовольствия выполните поиск по инициализации двойными скобками (взлом синтаксиса). - person Luke Usherwood   schedule 09.09.2016