Когда выполняются эти статические блоки классов и подклассов (для Enum)? - PullRequest
3 голосов
/ 26 июля 2011

Я пытаюсь определить базовый класс (SubStatus) для Enum.

Когда блоки static вызываются ниже? Если бы они были классами, а не перечислениями, я считаю, что они будут вызваны после вызова конструктора классов?

Но поскольку они Enum с, разве это не больше похоже на 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); 
     }
}

Ответы [ 3 ]

4 голосов
/ 26 июля 2011

Статический блок обрабатывается, когда был выполнен первый вызов перечисления, но после создания всех значений перечислений.Кстати, ваш код не будет работать.В перечислениях Java нет наследования.Если вам нужно что-то подобное, прибегните к интерфейсам.

1 голос
/ 30 сентября 2012

Это порядок:

  1. Конструкторы Enum

    Конструкторы enum запускаются до инициализации статических полей.Это необходимо, поскольку статические методы должны иметь доступ к всем значениям перечисления (экземплярам).Перечисляемые значения неявно присваиваются статическим полям.

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

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

Ссылки:

1 голос
/ 26 июля 2011

«конструктор класса» - разговорный термин, имя согласно спецификации - статический инициализатор . На заметку: в Java нет такого понятия, как «статический класс»; -)

Перечисления в Java являются классами. Они имеют одинаковую отделку и поведение (они могут даже иметь изменяемые поля, хотя обычно это плохая идея). Они ограничены только в своей иерархии типов (они не должны явно расширять другой класс и сами не могут быть явно расширены) и в построении (их значения перечисления являются экземплярами only , которые когда-либо могут быть созданы).

Поэтому блоки статического инициализатора выполняются так же, как и для обычных классов: когда класс загружается / инициализируется. Обычно это происходит при первом обращении.

...