Java枚举 - 自定义getValues()vs values()

时间:2015-12-23 10:51:18

标签: java enums

在我正在研究的项目中,我发现了一个奇怪的代码:

public enum Service {
    ...
    private static final Service[] values = values();

    public static Service[] getValues() {return values;}
}

您是否知道为什么实施者添加了他的自定义方法而不是在任何地方使用values()方法?我知道,values()方法是在编译时生成的,它会影响到什么吗?

2 个答案:

答案 0 :(得分:4)

这是因为普通Enum.values()每次都会创建一个 new 数组,以确保调用的结果始终一致。

此代码正在删除它并只调用一次。这可能是因为编码器认为这可能导致内存泄漏/颠簸。

这是一种代码味道,因为您可以执行Service.getValues()[2] = xxx;并破坏所有用户的数组。

答案 1 :(得分:0)

我已经使用 做了一次,因为这是解决此问题的简单方法:

  • 你有一个A类,有方法和静态数据(参数......)

  • 你想要使用相同方法(B或A)的子类B1,B2,它们有自己的参数或参数A(取决于B1,B2,......)

您不能将静态变量子类化,然后通过可以子类化的方法获取它们。默认情况下,您会获得静态参数。

使用Enum(无法扩展)是不可能的,但也许编码器想扩展。一篇有用的帖子:Can enums be subclassed to add new elements?