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

2022-08-31 17:28:13

我有这样的枚举:

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

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


答案 1

使用 将在每次调用数组时创建数组的新副本。我有时会创建自己的(或集合,或地图,无论我需要什么),以避免这种毫无意义的复制。不过我不会硬编码...如果你只需要尺寸,我只使用:values().lengthList

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

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

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

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


答案 2

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