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)
Java 5枚举源自Joshua Bloch的Effective 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枚举提供了超过整数的这些优势:
EnumSet
和EnumMap
.Java 5比使用类更能体现这些优势:
readResolve()
等); 归档时间: |
|
查看次数: |
22512 次 |
最近记录: |