什么是更好的查找枚举大小的方法?

3

可能是重复问题:
Enum values().length vs private field

我想知道哪种方法更好地找到枚举的大小。

这种方式:

public enum Company {

    AUDI(4), BMW(5), CADILLAC(11), FORD(44), JAGUAR(45);

    private final int id;
    public final int length = Company.values().length;

    private Company(int id) {
        this.id = id;
    }
}

或者这样:

public enum Company {

    AUDI(4), BMW(5), CADILLAC(11), FORD(44), JAGUAR(45);

    private final int id;
    public final int length = 5;

    private Company(int id) {
        this.id = id;
    }
}

@downvote... 如果有人给这个问题点了踩,请在下面添加一个原因。这将帮助我理解出了什么问题。 - amod
1
点赞了毫无意义的未经解释的踩。@踩人,请在踩的时候说明原因。 - user207421
感谢 EJP 的点赞! - amod
5个回答

5

given -

enum Widgets {TINY, SMALL, AVERAGE, BIG};

小部件的尺寸为:
Widgets.values().length

2
抱歉,我可能只是漏看了什么,但他的第一个示例不就是这样吗? - love_me_some_linux
我不想使用这个,因为它会一直创建数组。长度应该在enum内部。 - amod

4
第一种方法,但将其设为static,这样就不会产生多个数组副本。
public final static int length = Company.values().length;

既然我们已经将其声明为静态的,每当我们使用长度时它不会创建新数组,对吧?请回复。 - amod
1
@amod0017 是的,静态变量只会被初始化一次。 - dogbane
很好,你能建议我如何将枚举项作为字符串数组获取吗?values方法给了我一个错误。 - amod
values()会给你一个Company[]数组。循环遍历该数组并调用toString将每个枚举转换为字符串并存储到另一个数组中。 - dogbane
好的...我想避免循环,是否有更好的方式可行? - amod
我只使用了你的方法,现在它可以正常工作。感谢你的帮助。 - amod

2
第二种方法的问题在于每次添加新值时,都必须手动更新长度。而对于第一种方法,它是动态的,甚至可以将其设置为静态(因为如果不这样做,它将取决于每个枚举实例的整数)。
public final static int length= Company.values().length;

但我建议使用'Company.values().length',因为它更加标准。


2

无所谓的,只需在需要的地方使用 myEnum.values().size 即可。


它会一遍又一遍地创建数组。请看类似的问题在stackoverflow上提出的。 - amod

2

在我看来,第一种方法更好。这样,如果你向枚举中添加更多的公司,你就不必手动更新长度变量。


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