Когда выполняются эти статические блоки класса и подкласса (для 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 неявно назначаются статическим полям.

  • Статические инициализаторы

    Затем статические инициализаторы и статические блоки вызывают в порядке появления.

Литература: