阅读Enum Types, The Java Tutorials:
编译器在创建时会自动添加一些特殊方法 一个枚举。例如,他们有一个返回an的静态值方法 包含枚举的所有值的数组 声明。这种方法通常与之结合使用 for-each构造迭代枚举类型的值。
我想知道values()
方法究竟是做什么的。它是否实际上只是返回一个类成员/常量,还是更多的是在引擎盖下?以下代码绝不旨在演示最佳实践,但强调了这个问题的答案将如何影响我如何处理问题:
如果values()
返回一个类成员/常量,我会考虑自由地调用它(参见getAllValues()
),如下所示:
enum ExampleEnum {
A("A's String"), B("B's String"), C("C's String");
ExampleEnum(String someValue) {
this.someValue = someValue;
}
private final String someValue;
private String[] getAllValues() {
String[] result = new String[values().length];
for (int i = 0; i < values().length; i++) {
result[i] = values()[i].someValue;
}
return result;
}
}
如果它正在进行实际工作,我将按以下方式更改getAllValues()
:
private String[] getAllValues() {
ExampleEnum[] values = values();
String[] result = new String[values.length];
for (int i = 0; i < values.length; i++) {
result[i] = values[i].someValue;
}
return result;
}
答案 0 :(得分:3)
每次调用values()
时,您都在创建填充了枚举常量的新数组。您可以使用==
运算符
System.out.println(ExampleEnum.values()==ExampleEnum.values());//prints false
所以第二个选项会更好,因为它会创建一次这个数组。但是为了改进它,您可以简单地将values()
的结果存储在此方法之外,并在需要时重复使用它。这样你只需调用一次。您还可以先创建someValue
元素的集合,将其存储为不可修改的集合(如List)并将其返回。
所以你的代码看起来像:
enum ExampleEnum {
A("A's String"), B("B's String"), C("C's String");
ExampleEnum(String someValue) {
this.someValue = someValue;
}
private final String someValue;
private static final ExampleEnum[] vals = values();
private static final List<String> names = Collections.unmodifiableList(
Stream.of(vals).map(en -> en.someValue).collect(Collectors.toList()));
public static List<String> getAllValues() {
return names;
}
}