首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >何时在java中使用Enum类?

何时在java中使用Enum类?
EN

Stack Overflow用户
提问于 2019-11-24 21:28:47
回答 3查看 148关注 0票数 3

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

假设您定义了一个事件Enum,首先它只包含Poo,然后我们知道我们总是有一些新的需求,它也变成了Poo,App,Laa,并且不断地变化,

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-24 22:28:52

tl;dr

  • 如果在编译时知道全部可能的值,则使用enum
  • 如果在系统使用时(在运行时)可以添加或删除值,则不能使用枚举。改用SetListMap

已知于编译时

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

如果你的公司今年提供两种产品( Poo & your ),那就为这两种元素做点说明吧。

代码语言:javascript
运行
复制
public enum Product { POO , TOO }

明年,你的公司决定通过添加App & Laa来增加他们的产品。作为计划部署的一部分,在枚举中再添加两个对象。

代码语言:javascript
运行
复制
public enum Product { POO , TOO , APP , LAA }

顺便说一句,请注意命名约定。枚举有一个常规的类名(首字母上限)。被自动实例化的对象是常量,所以用大写字母命名.

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

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

在运行时已知

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

辛格尔顿

虽然最初不是作为Java中Enum的目的,但enum恰好是实现https://en.wikipedia.org/wiki/Singleton_pattern设计模式的最安全(也是最简单)的方法。

约书亚·布洛赫博士等人在著名的“有效Java”一书中解释了这一方法。使用枚举解决了单个实例的其他方法存在的多个模糊的技术问题。

票数 5
EN

Stack Overflow用户

发布于 2019-11-24 21:54:01

你的问题很笼统,我敢肯定没有一个正确的答案。但是根据spring*标记来判断,我想您可能是在询问DTO中的枚举,这些枚举是以序列化的形式通过您的系统发送的。如果是这样的话,我建议在DTO中选择String,而在单个应用程序中使用enum是可以的。然后,您将只关心以工厂方式进行反序列化/转换,能够通过日志记录/提供回退或有意义的错误来优雅地处理未知/缺失常量。

票数 0
EN

Stack Overflow用户

发布于 2019-11-24 22:07:07

这取决于逐个案例的情况,而你的问题没有太多的背景。但是,我确实建议在许多情况下使用ENUM,包括如果您期望ENUM的列表增加。

使用它们的一些理由是:

  1. 它创建了一个明确的ENUM元素指南,可以在整个代码中使用。它消除了关于某物的名称或它是什么的不确定性。例如,包含动物列表的ENUM,或“某事”的枚举。
  2. 如果您需要更改任何内容,稍后再重构是很容易的。

我相信还有更多的原因,有时我会发现它就像一张目录。在很多情况下,你可以完全避免它,而且很好,但我认为,如果你是在围栏一般使用它更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59022597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档