当前位置:  开发笔记 > 编程语言 > 正文

无法引用初始化程序中的静态枚举字段?

如何解决《无法引用初始化程序中的静态枚举字段?》经验,为你挑选了2个好方法。

我刚刚得到Java5项目有这个错误,我尝试使用Java5和Java6,但它仍然存在.它以某种方式工作(因为它是在svn),我怎么能绕过编译器错误?



1> Jon Skeet..:

不要"绕过"错误 - 它不会做你想要的.错误是有充分理由的.

枚举值在任何其他静态字段之前初始化.如果你想做一些事情,比如将所有值添加到地图中,请在静态初始化程序之后执行其他操作:

import java.util.*;

public enum Foo
{
    BAR, BAZ;

    private static final Map lowerCaseMap;

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


在上面的例子中是否有理由使用`Foo foo:EnumSet.allOf(Foo.class)`而不是`Foo foo:Foo.values()`?

2> Luan Nico..:

另一种"绕过"它的方法,如果你需要一个计数器或需要在每个初始化时运行的东西,就是创建一个私有静态内部类,如下所示:

public enum Foo {
    BAR, BAZ;

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

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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有