簡體   English   中英

無法引用初始化程序中的靜態枚舉字段?

[英]Cannot refer to the static enum field within an initializer?

我剛剛得到Java5項目有這個錯誤,我嘗試使用Java5和Java6,但它仍然存在。 它以某種方式工作(因為它是在svn),我怎么能繞過編譯器錯誤?

不要“繞過”錯誤 - 它不會做你想要的。 錯誤是有充分理由的。

枚舉值在任何其他靜態字段之前初始化。 如果你想做一些事情,比如將所有值添加到地圖中,請在靜態初始化程序之后執行其他操作:

import java.util.*;

public enum Foo
{
    BAR, BAZ;

    private static final Map<String, Foo> lowerCaseMap;

    static
    {
        lowerCaseMap = new HashMap<String, Foo>();
        for (Foo foo : EnumSet.allOf(Foo.class))
        {
            // Yes, use some appropriate locale in production code :)
            lowerCaseMap.put(foo.name().toLowerCase(), foo);
        }
    }
}

另一種“繞過”它的方法,如果你需要一個計數器或需要在每個初始化時運行的東西,就是創建一個私有靜態內部類,如下所示:

public enum Foo {
    BAR, BAZ;

    private static final class StaticFields {
        private static final Map<String, Foo> lowerCaseMap = new HashMap<>();
        private static int COUNTER = 0;
    }

    private Foo() {
        StaticFields.lowerCaseMap.put(this.name().toLowerCase(), this);
        StaticFields.COUNTER++;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM