2010-01-16 90 views
19

在Java中使用类似于类的枚举有什么好处,而不仅仅是像C/C++中那样的常量集合?Java中的枚举。优点?

+0

检查http://stackoverflow.com/questions/1419835/understanding-enums-in-java/1419849#1419849 – Narayan 2010-01-16 14:46:10

回答

24

您可以免费获得编译时有效值的检查。使用

public static int OPTION_ONE = 0; 
public static int OPTION_TWO = 1; 

不保证

void selectOption(int option) { 
... 
} 

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

+0

这个答案击中的主要优势,但它忽略了其他答案中详述的其他几个优点。 – DJClayworth 2011-02-14 14:36:55

4

枚举已经是class in Java

如果你问为什么这是更好的,我会说,更好的类型安全性和能力增加其他属性,除了单纯的序号值会浮现在脑海中。

0

枚举是一种本身 - 你不能用一个不存在的枚举,或把一些其他类似的期待不变。还可以枚举它们,以便代码更加简洁。

使用静态常量可能会导致maintenence噩梦 - 特别是如果他们区域上展开。

11

类型安全是其中一个原因。

另外,that I find more important,是你可以将元数据在Java中的枚举值。例如,你可以使用一个枚举来定义一组法律操作的Web服务,然后附加元数据请求和数据类的类型:

AddItem(HttpMethod.POST, ProductEntry.class), 
+2

请注意这一点。我经常看到人们用属性而不是类来使用枚举。这可能会导致周围的代码使用枚举非常奇怪和静态(有效地试图将对象注入枚举),因为它们非常热衷于保持枚举,而不是将所述枚举转换为合适的类,并重构命中。 – DaveC 2010-01-16 18:15:43

+1

这似乎很漂亮的病态;希望看到一个例子。所以也许有些规则是按顺序的:没有可变状态,也没有行为。 – kdgregory 2010-01-17 13:07:44

3

除了更好的类型安全,你也可以定义您的枚举中的自定义行为(请参阅Effective Java以获得一些很好的示例)。

1

使得枚举,它可以包含固定的常数集的引用类型导致了高效地图实现像 EnumMap的设置实现像 EnumSet(JDK类)。

从EnumMap的javadoc的的:
与枚举类型键一起使用的专用Map实现。枚举映射中的所有键必须来自单个枚举类型,该映射在创建映射时明确或隐含地指定。枚举映射在内部表示为数组。这种表示非常紧凑和高效。

EnumMap结合了Map的丰富性和类型安全性以及数组的速度(Effective Java)。

0

唯一real的优点是它可以用在switch声明中。所有其他的东西枚举能够正好可以用普通的香草类完成了private构造,其实例又被声明为有问题的类public static final字段(类型安全模式)。枚举的另一个好处显然在于它使得代码不像使用普通的香草类那样冗长。

但是如果我没有弄错,在C++中(或者是C#?),您可以在switch语句中使用String。因此,与C++相比,Java中的枚举优势可以忽略不计。然而,Java 7也提出了同样的问题,不知道它是否会成功。

6

Java 5的枚举源自类型安全枚举图案从Joshua BlochEffective Java(第一版),以避免在C/C++/C#枚举的缺陷(它们是简单地薄-隐晦INT常量)和在Java中使用最终的静态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); 

不幸的是,从有效的Java类型安全枚举模式有很多的样板,但并非所有的很明显。最值得注意的是,你不得不重写私人方法readResolve停止使用Java创建的反序列化的新实例,这将打破简单的参考检查(使用而不是equals()==运营商)。

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

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

Java 5个的枚举过这些优点在刚刚使用类:

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

重写'readResolve()'并不重要。我经常为有限数量的实例做类。有时'enum'会简化这些类的定义,有时不会。使用正确的工具来完成这项工作。 – finnw 2010-01-17 02:29:55

2

您可以使用枚举有效落实单身^^:使用枚举的

public enum Elvis { 
    INSTANCE 
} 
+1

-1 - 你应该避免单身人士,没有办法“有效地实施”他们(这种方法,顺便说一句,加载时初始化,这是非常痛苦的调试) – kdgregory 2010-01-17 14:38:01

+1

我只是想指出,如果你需要/想要使用Singletons,这是Java中最好的方法 – helpermethod 2010-01-17 17:26:17

+9

顺便说一句,单身人士DO有他们的用途 – helpermethod 2010-01-17 17:28:42

0

优点: 对象可以创建以相同的方式工作,因为枚举。实际上,直到5.0版本之前,甚至还没有将Java枚举中的 枚举包含在内。但是,枚举使代码更具可读性,并且为程序员错误提供了更少的空间。

OCA Java SE 7中编程我学习指南