枚举值() - 每次调用或赋值给变量

时间:2015-05-06 13:18:05

标签: java enums

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

1 个答案:

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