在Java中的枚举.好处?

gam*_*ver 19 java enums

将Java中的枚举类似于类,而不仅仅是C/C++中的常量集合有什么好处?

FRo*_*owe 27

您可以免费编译有效值的编译时间.运用

public static int OPTION_ONE = 0;
public static int OPTION_TWO = 1;
Run Code Online (Sandbox Code Playgroud)

不保证

void selectOption(int option) {
...
}
Run Code Online (Sandbox Code Playgroud)

只接受0或1作为参数值.使用枚举,这是有保证的.此外,这会导致更多自我记录代码,因为您可以使用代码完成来查看所有枚举值.


kdg*_*ory 11

类型安全是一个原因.

另一个我发现更重要的是,您可以将元数据附加到Java中的枚举值.例如,您可以使用枚举来定义Web服务的合法操作集,然后附加请求类型和数据类的元数据:

AddItem(HttpMethod.POST, ProductEntry.class),
Run Code Online (Sandbox Code Playgroud)

  • 小心这个.我经常看到人们使用带有属性的枚举而不是类.这可能导致周围的代码使用枚举非常奇怪和静态(有效地尝试将对象注入到枚举中),因为它们非常渴望保持枚举,而不是将所述枚举转换为适当的类并采用重构命中. (2认同)

cle*_*tus 7

Java 5枚举源自Joshua BlochEffective Java(第一版)中的类型安全枚举模式,以避免C/C++/C#中的枚举陷阱(这些只是简洁的int常量)以及Java中的最终使用static int常量.

主要的int常量和int枚举不是类型安全的.您可以传入任何int值.在C/C++中,您可以这样做:

enum A { one, two, three };
enum B { beef, chicken, pork } b = beef;

void func(A a) { ... }
func((A)b);
Run Code Online (Sandbox Code Playgroud)

不幸的是,Effective Java中的类型安全枚举模式有很多样板,并不是很明显.最值得注意的是你必须覆盖私有方法readResolve来阻止Java在反序列化时创建新实例,这会破坏简单的引用检查(即使用==运算符而不是equals()).

所以Java 5枚举提供了超过整数的这些优势:

  • 型号安全;
  • Java 5枚举可以具有行为和实现接口;
  • Java 5枚举有一些非常轻量级的数据结构,如EnumSetEnumMap.

Java 5比使用类更能体现这些优势:

  • 不易出错的样板(私有构造函数readResolve()等);
  • 语义正确.你看到一些东西是枚举,你知道它只是代表一个价值.你看到一堂课,你不确定.也许在某处有一个静态工厂方法等.Java 5枚举更清楚地表明了意图.


Jac*_*eow 5

除了更好的类型安全性之外,您还可以在枚举中定义自定义行为(请参阅Effective Java以获取一些很好的示例)。