Когда выполняются эти статические блоки класса и подкласса (для Enum)?
Я пытаюсь определить базовый класс (SubStatus
) для Enum.
Когда находятся блоки static
, называемые ниже? Если они были классами, а не перечислениями, я считаю, что они будут вызваны после вызова класса конструктора?
Но поскольку они Enum
s, не являются ли они больше похожими на классы static
? Итак, возможно, статические блоки выполняются, когда контейнер загружает статические экземпляры?
Подстатус
public enum SubStatus
{
WAITING(0),
READY(1);
protected static final Map<Integer,SubStatus> lookup
= new HashMap<Integer,SubStatus>();
static {
for(SubStatus s : EnumSet.allOf(SubStatus.class))
lookup.put(s.getCode(), s);
}
protected int code;
protected SubStatus(int code) {
this.code = code;
}
public int getCode() { return code; }
public static SubStatus get(int code) {
return lookup.get(code);
}
}
Состояние
public enum Status extends SubStatus
{
SKIPPED(-1),
COMPLETED(5);
private static final Map<Integer,Status> lookup
= new HashMap<Integer,Status>();
static {
for(Status s : EnumSet.allOf(Status.class))
lookup.put(s.getCode(), s);
}
private int code;
private Status(int code) {
this.code = code;
}
public int getCode() { return code; }
public static Status get(int code) {
return lookup.get(code);
}
}
Ответы
Ответ 1
Статический блок обрабатывается, когда был сделан первый вызов вашего перечисления, но после того, как были созданы все значения перечислений. Btw, ваш код не будет работать. Наследования Java нет. Прибегать к интерфейсам, если вам нужно что-то вроде этого.
Ответ 2
"конструктор классов" - это разговорный термин, имя, согласно спецификации, статический инициализатор. В отношении связанной заметки: в Java нет такой вещи, как "статический класс"; -)
Перечисления на Java - это классы. Они имеют все те же обходы и поведение (они могут даже иметь изменяемые поля, хотя обычно это плохая идея). Они ограничены только в иерархии типов (они не должны явно расширять другой класс и не могут быть явно расширены сами) и в конструкции (их значения перечисления являются единственными экземплярами, которые могут когда-либо создаваться).
Поэтому статические блоки инициализатора выполняются так же, как и для обычных классов: когда класс загружен/инициализирован. Обычно это происходит при первом доступе.
Ответ 3
Это порядок:
-
Конструкторы Enum
Конструкторы перечисления запускаются до инициализации статических полей. Это необходимо, потому что статические методы должны иметь доступ ко всем значениям перечисления (экземплярам). Значения Enum неявно назначаются статическим полям.
-
Статические инициализаторы
Затем статические инициализаторы и статические блоки вызывают в порядке появления.
Литература: