【问题标题】:Which usage is preferred Enum.values() or Enum.class.getEnumConstants()?Enum.values() 或 Enum.class.getEnumConstants() 首选哪种用法?
【发布时间】:2021-02-12 05:06:57
【问题描述】:

要获取一些Enum 类型TestEnumenum 常量数组,我们有两个选项-TestEnum.values()TestEnum.class.getEnumConstants()。当我查看代码时,我可以看到getEnumConstants() 正在通过反射调用values() 方法,然后将其缓存以备将来使用。在返回之前,数组也会被克隆。

从下面的问题及其答案(仅关注性能)看来,性能上并没有太大差异。

Comparison of enums values() method and class.getEnumConstants()

我想知道其中一种方法是否比另一种更受欢迎。我能想到的一种情况是,在创建一个适用于泛型的方法时,我们将泛型 enum 类作为参数传递。

<E extends Enum<E>> void doSomething(Class<E> clazz){
    for(E type : clazz.getEnumConstants()){
        // do something...
    }
}

在上述情况下,我们只能使用getEnumConstants 方法。

还有其他类似的场景吗?如果我确定要使用的enum 的类型,那么使用values() 方法不是更好吗?

【问题讨论】:

  • 除非你需要使用反射,否则使用values()
  • @Slaw 任何可能使用反射的场景?除了我提到的那个
  • 简单的答案是,当类型仅在运行时已知时,您只需要getEnumConstants()。如果您在编译时对类具有静态访问权限,则没有理由不使用 values()
  • @ernest_k 我建议您对该评论进行 Amswer,以便可以解决此页面。
  • @Gautham M 你提到的问题打印了 JDK1.8 的测试结果,但是如果你在 JDK16 上运行它,输出的计时结果有很大不同,有利于 values()。

标签: java reflection enums


【解决方案1】:

此处适用的唯一答案是基于每个选项的设计目的。

Class 类上可用的方法是为类的动态、运行时检查而设计的,因此当枚举类列出的值仅在程序运行时才知道时,将使用 Class.getEnumConstants()。您在泛型方法中的查找示例说明了正确的用法。

如果你静态知道类,那么你应该使用YourEnumClass.values()。没有正当理由通过 Class 实例来执行此操作。

【讨论】:

  • 用通用方法示例的代码更新了问题
猜你喜欢
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2020-06-04
  • 2010-10-03
  • 2011-05-23
  • 2019-06-07
相关资源
最近更新 更多