【问题标题】:Java: Getting an array of ENUM elementsJava:获取 ENUM 元素的数组
【发布时间】:2011-09-03 20:40:27
【问题描述】:

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

    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;
    }

【问题讨论】:

    标签: java arrays enums


    【解决方案1】:

    我个人不会将它们公开为数组,任何人都可以更改其内容。我可能会改用不可修改的列表 - 可能通过属性而不是字段公开它。初始化是这样的:

    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。
    【解决方案2】:

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

    如果你使用它经常缓存在枚举中

    【讨论】:

    • 请解释一下“缓存”是什么意思。将静态数组移动到枚举主体?
    • 将其存储在一个字段中,这样您就不会每次都计算它
    • 我确信这段代码只会运行一次(在第一次访问类时)。
    • 啊,是的 - 我错过了常量定义。所以你已经在缓存它了。
    【解决方案3】:

    如果您非常频繁地使用您的值并且您的枚举变得更大,请使用 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) 等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 2013-05-07
      • 2016-03-09
      • 2016-09-25
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多