【问题标题】:enum values() - call each time or assign to variable [duplicate]枚举值() - 每次调用或分配给变量[重复]
【发布时间】:2015-05-06 13:18:05
【问题描述】:

来自阅读Enum Types, The Java Tutorials

编译器在创建的时候会自动添加一些特殊的方法 一个枚举。例如,它们有一个静态值方法,该方法返回一个 按顺序包含枚举的所有值的数组 宣布。这种方法通常与 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;
}

【问题讨论】:

    标签: java enums


    【解决方案1】:

    每次调用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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-20
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多