Краткий ответ: используйте блоки static
только в том случае, если для их использования необходимо .
В первых двух примерах нет семантики c или разницы в производительности, а также правильный способ написания кода - это простой способ.
Третий пример семантически отличается. Установщик фактически не инициализирует переменную stati c. Это повторная инициализация переменной. (Вы можете вызвать получатель перед вызовом установщика, и это покажет вам действительное начальное значение; т. Е. Ноль.)
Нет ничего плохого в использовании установщика (согласно вашей третьей пример) но он делает что-то другое. Если вам просто нужна простая инициализация с фиксированным значением, не делайте этого так. Сделай это простым способом.
(Последний пример, похоже, не подходит, поэтому я его проигнорирую.)
В некоторых случаях невозможно выполнить необходимую инициализацию в одном выражении. (Например, может потребоваться выполнить последовательность операторов для заполнения объекта, или перехватить и обработать исключение, или иметь дело с final
объектами 1 , которые ссылаются друг на друга.) В этих случаях Блок static
- это возможные решения.
Существует ли "основная разница" между первыми двумя подходами?
Я так не думаю.
static Foo foo = <expression>; // where this is legal Java code
на 100% семантически эквивалентен:
static Foo foo;
static {
foo = <expression>;
}
Просто есть некоторые вещи, которые вы можете сделать с блоком stati c, которые вы не можете сделать с простым инициализатором. Блок stati c может быть более сложным, чем отдельный оператор присваивания.
1 - я «не в курсе» терминологии. На самом деле переменные final
не являются объектами.