【问题标题】:Java enum - custom getValues() vs values()Java 枚举 - 自定义 getValues() 与 values()
【发布时间】:2015-12-23 10:51:17
【问题描述】:

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

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

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

你知道为什么实现者添加了他的自定义方法而不是到处使用 values() 方法吗?我知道,values() 方法是在编译时生成的,它有什么影响吗?

【问题讨论】:

  • 他写的JavaBeans太多了?已经是半夜了,他应该早点回家吧?他认为values() 很慢,想将结果存储在变量中以“提高性能”?
  • 有太多可能的答案,从企业愚蠢的政策到硬习惯甚至更糟。我们怎么知道?
  • 如果您希望使用这些值,可能某些框架会要求这样做,例如 UI 框架?
  • 我同意 Krzysztof Cichocki 的观点。框架需要 getXxx 方法是通用的:)
  • 并不奇怪:它对子类很有用:见我的回答。

标签: java enums


【解决方案1】:

这是因为普通的Enum.values()每次都会创建一个new数组来保证调用的结果总是一致的。

此代码将删除它并仅调用它一次。可能是因为编码人员认为这可能导致内存泄漏/抖动。

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

【讨论】:

  • 这通常被称为方法,创建一个新数组会增加 GC 的工作量。好像是这样的。您能否提供任何资源来检查 values() 方法的工作原理?
  • @awfun 请参阅:stackoverflow.com/questions/32799282 正如此答案所述,每次调用都会创建一个新数组。但是如果你有 10 个枚举常量,这意味着你创建了 ca.每次调用 50 字节的垃圾。除非您调用 values 方法数百万次,否则不会有太大的不同。在性能方面,values() 比getValues 花费的时间大约多 3 倍,即在我的计算机上,10 纳秒而不是 3 秒。同样,除非您的应用程序一直调用它,否则它并不重要。如前所述,getValues 引入了一个潜在的错误,因此这种权衡似乎不值得。
【解决方案2】:

我已经用一个类做过一次,因为这是解决这个问题的简单方法:

  • 您有一个 A 类,其中包含方法和静态数据(参数、...)

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

    李>

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

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

【讨论】:

  • @assylias 完全正确。我根据情况改变我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
相关资源
最近更新 更多