java中什么时候使用Enum类?

DAL*_*OUL 3 java enums spring spring-boot

这可能是非常明显的问题,但是如果您知道值列表会不断增加,那么使用 Enum 类好吗?

假设您首先定义一个事件枚举,它仅包含 [Poo, Too],然后我们知道我们总是有一些新的要求,它变成 [Poo, Too, App, Laa] 并且不断变化,

那么在这种情况下最好的方法是什么?

Bas*_*que 5

太长了;博士

  • 如果在编译时已知整个可能值集,请使用 enum
  • 如果可以在系统使用时(运行时)添加或删除值,则不能使用 enum。使用SetList、 或Map代替。

编译时已知

当域(所有可能值的集合)在编译时已知时,枚举是合适的。

如果今年您的公司提供两种产品(Poo 和 Too),那么为这两个元素创建一个枚举。

public enum Product { POO , TOO }
Run Code Online (Sandbox Code Playgroud)

明年,您的公司决定通过添加 App 和 Laa 来扩大其产品范围。作为计划部署的一部分,向您的枚举添加另外两个对象。

public enum Product { POO , TOO , APP , LAA }
Run Code Online (Sandbox Code Playgroud)

顺便说一下,请注意命名约定。枚举有一个常规的类名(初始上限)。自动实例化的对象是常量,因此以全大写命名。

另外,请注意,Java 中的枚举功能非常灵活且强大,比大多数语言中常见的命名数字枚举方案要强大得多。Java 枚举上可以有成员变量、方法和构造函数。例如,您可以添加一个getDisplayName方法来提供比全大写对象名称更适合用户界面的文本,如 中所示DayOfWeek::getDisplayName。您可以添加相当多的功能,例如ChronoUnit.between.

在运行时,Java 中的枚举不能添加或删除对象因此,要求您在编译时知道您的域。但是,当使用一组枚举对象时,您可以使用高度优化的EnumSetEnumMap类。

运行时已知

如果无法在编译时确定域,如果用户可以在运行时添加或删除元素,则使用、或 等集合,而不是枚举ListSetMap


辛格尔顿

尽管枚举最初并不是 Java 中的目的Enum,但枚举恰好是实现单例设计模式的最安全(也是最简单)的方法。

Joshua Bloch 博士等人在著名的《Effective Java》一书中解释了这种单例方法。使用枚举可以通过其他单例方法解决多个晦涩的技术问题。