访问枚举中的静态字段

时间:2013-11-21 10:36:15

标签: java static enums initialization

通常我已经知道在编译期间首先执行Java类中的static块/初始化。但是试图访问enum内的静态字段会给我错误

  

无法在初始值设定项中引用静态枚举字段ExportToReports.Animal.num

为什么会发生此错误,因为静态变量必须已初始化?

public enum Animal{
    cat(2), dog(3);
    int id, number;
    static int num = 5;
    Animal(int id)
    {
        this.id = id;
        this.number = Animal.num;
    }   
}

这是否意味着当涉及枚举静态块时,不会先执行?请解释

2 个答案:

答案 0 :(得分:3)

一个简单的解决方法是将静态字段放在静态内部类中:

enum Foo{
  RED,GREEN,BLUE;

  private final int value;
  private Foo(){
     this.value = ++ Bar.heresMyStaticField;
  }

  static class Bar{
     private static int heresMyStaticField;
  }
}

是否这样做是完全不同的问题。

答案 1 :(得分:2)

第一次加载类时会发生静态初始化。作为枚举的catdog会进行静态处理以进行初始化,并首先进行初始化(因为它们在num上方声明)。初始化它们时,必须已初始化其构造函数中的任何引用。您可以通过声明num字段final在编译时初始化num来完成此工作:

final static int num = 5;

如果num需要在初始化后更改值,那么您需要将其从枚举中移出并转移到另一个类。