在枚举中访问静态字段

通常我已经了解到,在编译期间,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;
    }   
}

那么这是否意味着当涉及到枚举时,静态块不会首先被执行?请解释一下


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

enum Foo{
  RED,GREEN,BLUE;

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

  static class Bar{
     private static int heresMyStaticField;
  }
}

你是否应该这样做是一个完全不同的问题。


静态初始化在类首次加载时发生。 catdog ,如枚举,静态处理初始化的目的,首先初始化(因为它们是上述声明num )。 当它们被初始化时,其构造函数中的任何引用必须已经被初始化。 你可以通过声明在编译时初始化num的num字段来完成这项工作:

final static int num = 5;

如果num在初始化之后需要改变值,那么你需要将它从枚举中移出并移到另一个类中。

链接地址: http://www.djcxy.com/p/38065.html

上一篇: Accessing static fields inside enum

下一篇: Why enum constructor can't access static field