Java枚举超过常量

可能重复:
了解Java中的枚举

我们为什么要使用枚举而不是Java常量?

我已经读过Java枚举提供了类型安全性。 有人可以详细说明吗? 或者使用枚举超过常量还有其他优点吗?

引用http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html :

public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } 

当你有这个方法:

 public EnumTest(Day day) { this.day = day; } 

你知道这个论点总会成为一天。

与此相比:

 const int MONDAY = 1; const int TUESDAY = 2; const int CAT = 100; const int DOG = 101; 

你可以传递任何东西给这个方法:

 public EnumTest(int day) { this.day = day; } 

使用enum (或任何类型,如类或接口)为您提供类型安全:类型系统确保您只能获得所需的类型。 第二个例子在这方面不是类型安全的,因为你的方法可以将任何int作为参数,并且你不确定int值的含义。

使用枚举是调用代码和被调用代码之间的契约,给定值是给定类型。

你有动物ids的图像:

 int DOG = 1; int CAT = 2; int COW = 3; 

一个变量:

 int animal; 

只运行3个这些数字就可以了。 但如果你犯了错误,那么编译器可以为你检查,如果你写的话

 animal = 5; 

你没有看到两个错误。 枚举为您提供了更好的方法。

 public enum Animal { Dog, Cat, Cow } Animal animal = Animal.Dog; 

现在你有类型安全。

另一个尚未提及的区别是,枚举可以在其中具有逻辑,即可以具有ctor和方法。

除了类型安全(已经提到)之外的一个原因是枚举有方法,意味着大量使用常量的代码可以迁移到枚举类本身(动态或静态方法)。