Java:获取一组ENUM元素

时间:2011-05-28 07:50:46

标签: java arrays enums

是否有更好的方法从枚举元素创建数组:

    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 个答案:

答案 0 :(得分: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,并以这种方式公开这些集合,以明确它们 不可变。 )

答案 1 :(得分:2)

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

如果您使用它,通常会将其缓存在枚举

答案 2 :(得分:2)

如果您经常使用您的值并且枚举变得更大,请使用地图。在你的班级中声明以下内容。

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)等。