枚举值()。长度与私有字段

时间:2009-11-16 11:49:38

标签: java enums

我有这样的枚举:

public enum Configuration {
    XML(1),
    XSLT(10),
    TXT(100),
    HTML(2),
    DB(20);

    private final int id;
    private Configuration(int id) {
        this.id = id;
    }
    public int getId() { return id; }
}

有时我需要检查枚举中有多少个字段。什么是最好的解决方案? 我应该使用方法“values()。length”吗?或许,我必须在枚举中创建常量字段,如下所示:

public enum Configuration {
    XML(1),
    XSLT(10),
    TXT(100),
    HTML(2),
    DB(20);

    private final int id;
    private Configuration(int id) {
        this.id = id;
    }
    public int getId() { return id; }

    public static final int Size = 5;
}

什么是最快,更优雅的解决方案?

4 个答案:

答案 0 :(得分:100)

每次调用时,使用values().length都会创建数组的新副本。我有时创建自己的List(或设置,或地图,无论我需要什么)以避免这种无意义的复制。我不会对它进行硬编码...如果你只需要这个尺寸,我只会使用:

private static final int size = Configuration.values().length;

最后。到评估时,所有值都将被初始化。这避免了其他答案中提出的干扰和不一致问题。

当然,这本身就是一个微优化......但最终会以更简单的代码结束,IMO。从其他地方调用values().length并不表达您感兴趣的内容,这只是只是枚举的大小 - 您通过一系列值获取它的事实是偶然的分散注意力,IMO。

使用values()的替代方法是使用EnumSet.allOf().size(),对于小型枚举来说,它会非常便宜 - 但同样,它不像只有size字段那样可读。

答案 1 :(得分:9)

我建议使用values().length。这更加优雅,与使用常量相比,性能开销可以忽略不计。此外,您可以消除常量与枚举的实际长度不一致的风险。

答案 2 :(得分:8)

通过存储你违反DRY principle的计数,所以除非你有充分的理由,否则你不应该这样做。

答案 3 :(得分:4)

另一种方法是使用在values()方法之上初始化的常量。

public enum Colors {
    BLUE, GREEN, FUCHSIA;
    public static int COUNT = Colors.values().length;
}

这样你就有了一个自动更新的常量,仍然可以避免这些" values()"开销。