相关疑难解决方法(0)

为什么enum的构造函数不能访问静态字段?

为什么enum的构造函数不能访问静态字段和方法?这对于类非常有效,但不允许使用枚举.

我要做的是将我的枚举实例存储在静态Map中.考虑这个允许通过abbreivation查找的示例代码:

public enum Day {
    Sunday("Sun"), Monday("Mon"), Tuesday("Tue"), Wednesday("Wed"), Thursday("Thu"), Friday("Fri"), Saturday("Sat");

    private final String abbreviation;

    private static final Map<String, Day> ABBREV_MAP = new HashMap<String, Day>();

    private Day(String abbreviation) {
        this.abbreviation = abbreviation;
        ABBREV_MAP.put(abbreviation, this);  // Not valid
    }

    public String getAbbreviation() {
        return abbreviation;
    }

    public static Day getByAbbreviation(String abbreviation) {
        return ABBREV_MAP.get(abbreviation);
    }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为枚举不允许在其构造函数中使用静态引用.然而,如果实现为类,它只能找到:

public static final Day SUNDAY = new Day("Sunday", "Sun");
private Day(String name, String abbreviation) {
    this.name = name;
    this.abbreviation = abbreviation;
    ABBREV_MAP.put(abbreviation, …
Run Code Online (Sandbox Code Playgroud)

java enums

100
推荐指数
4
解决办法
4万
查看次数

构造函数中的枚举和静态变量

编译器禁止访问枚举构造函数中的静态字段.下面的源代码可行,它使用静态字段:

public enum TrickyEnum
{
    TrickyEnum1, TrickyEnum2;

    static int count;

    TrickyEnum()
    {
        incrementCount();
    }

    private static void incrementCount()
    {
        count++;
    }

    public static void main(String... args)
    {
        System.out.println("Count: " + count);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

数:2.

但是,尽管差别很小,但下面的代码不起作用:

public enum TrickyEnum
{
    TrickyEnum1, TrickyEnum2;

    static int count;

    TrickyEnum()
    {
        count++; //compiler error
    }

    public static void main(String... args)
    {
        System.out.println("Count: " + count);
    }
}
Run Code Online (Sandbox Code Playgroud)

从我的搜索中,人们通常声称问题是由于静态字段初始化的顺序.但是第一个例子是有效的,那么为什么Java开发人员会禁止第二个例子呢?它也应该工作.

java enums static constructor

28
推荐指数
1
解决办法
695
查看次数

标签 统计

enums ×2

java ×2

constructor ×1

static ×1