Java:获取枚举元素的数组

6
有没有更好的方法从枚举元素创建数组:
    public static enum LOGICAL {
        AND ("&", "AND"),
        OR ("||", "OR");

        public final String symbol;
        public final String label;

        LOGICAL(String symbol, String label) {
            this.symbol=symbol;
            this.label=label;
        }
    }

    public static final String[] LOGICAL_NAMES = new String[LOGICAL.values().length];
    static{
        for(int i=0; i<LOGICAL.values().length; i++)
            LOGICAL_NAMES[i]=LOGICAL.values()[i].symbol;
    }

    public static final String[] LOGICAL_LABELS = new String[LOGICAL.values().length];
    static{
        for(int i=0; i<LOGICAL.values().length; i++)
            LOGICAL_LABELS[i]=LOGICAL.values()[i].label;
    }
3个回答

3

个人而言,我不会将它们作为数组公开,因为任何人都可以更改其内容。我可能会使用一个不可修改的列表 - 并可能通过属性而不是字段公开它。初始化代码应如下所示:

private static final List<String> labels;
private static final List<String> values;

static
{
    List<String> mutableLabels = new ArrayList<String>();
    List<String> mutableValues = new ArrayList<String>();
    for (LOGICAL x : LOGICAL.values())
    {
         mutableLabels.add(x.label);
         mutableValues.add(x.value);
    }
    labels = Collections.unmodifiableList(mutableLabels);
    values = Collections.unmodifiableList(mutableValues);
}

如果您已经在使用Guava,您甚至可以考虑使用ImmutableList,并以这种方式公开集合,以清楚地表明它们是不可变的。


是的!我希望标准Java API中有一个ImmutableList。 - Alvin

2
如果您的枚举类型使用频繁且数量较大,请使用 Maps。在您的类中声明以下内容:
private static EnumMap<LOGICAL,String> symbols = new EnumMap<LOGICAL, String>(LOGICAL.class);

接下来就在它下面:

static{
    for(LOGICAL i : LOGICAL.values().)
        symbols.put(i, i.symbol);
}

那么你可以使用symbols.values()symbols.get(LOGICAL.AND)等方法。


2

不。这似乎是正确的方式。即使有一些效用,它也将依赖于反射。

如果您经常使用它,请在枚举中缓存它。


请解释一下“缓存”是什么意思。将静态数组移动到枚举体中? - marcolopes
将其存储在字段中,以便您不必每次都计算它。 - Bozho
1
我相信这段代码只会运行一次(在第一次访问类时)。 - marcolopes
啊,是的 - 我错过了常量定义。所以你已经缓存它了。 - Bozho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接