“5.9 枚举类型”,在Java SE5中添加了一个看似很小的特性,即enum关键字,它使得我们在需要群组并使用枚举类型集时,可以很方便地处理。下面是一个简单的例子:
//: initialization/Spiciness.java publicenumSpiciness { NOT, MILD, MEDIUM, HOT, FLAMING}
///:~
枚举类型的实例都是常量,因此按照命名惯例它们都使用大写字母表示(多个单词用下划线隔开)。
为了使用enum,需要创建一个该类型的引用,并且将其赋值给某个实例:
//: initialization/SimpleEnumUse.java publicclassSimpleEnumUse { publicstaticvoidmain(String[] args) { SpicinesshowHot=Spiciness.MEDIUM; System.out.println(howHot); } }
/* Output:
MEDIUM
*///:~
Enum枚举拥有一些有用的特性,比如它会创建toString()方法,以便显示实例的名字,正如上面打印出来的输出。还会创建ordinal()方法,显示声明的顺序,以及static values()方法,用来按照enum常量的声明顺序,产生由这些常量值构成的数组:
//: initialization/EnumOrder.java publicclassEnumOrder { publicstaticvoidmain(String[] args) { for(Spicinesss : Spiciness.values()) System.out.println(s+", ordinal "+s.ordinal()); } }
/* Output:
NOT, ordinal 0
MILD, ordinal 1
MEDIUM, ordinal 2
HOT, ordinal 3
FLAMING, ordinal 4
*///:~
enum有一个特别实用的特性,即它可以在switch语句内使用:
//: initialization/Burrito.java publicclassBurrito { Spicinessdegree; publicBurrito(Spicinessdegree) { this.degree=degree;} publicvoiddescribe() { System.out.print("This burrito is "); switch(degree) { caseNOT: System.out.println("not spicy at all."); break; caseMILD: caseMEDIUM: System.out.println("a little hot."); break; caseHOT: caseFLAMING: default: System.out.println("maybe too hot."); } } publicstaticvoidmain(String[] args) { Burritoplain=newBurrito(Spiciness.NOT), greenChile=newBurrito(Spiciness.MEDIUM), jalapeno=newBurrito(Spiciness.HOT); plain.describe(); greenChile.describe(); jalapeno.describe(); } }
/* Output:
This burrito is not spicy at all.
This burrito is a little hot.
This burrito is maybe too hot.
*///:~
由于switch是要在优先的可能值集合中进行选择,因此它与enum正是绝佳的组合。上面就是enum的理解和基本的使用,后续会更加深入的探讨这一块。
“5.10 总结”,构造器这种精巧的初始化机制给我们一个暗示:初始化在Java中占有直观重要的地位。垃圾回收器会自动为对象释放内存,所以在很多场合下,一般不需要写专门的清理方法去清理类和对象资源,这样Java中的内存管理变得很简单。但是类似于文件,图形,数据库等资源的释放还是需要程序员仔细去设计,还有不要依赖垃圾回收机制能帮你释放实时性质的资源,如果对实时性要求很高,可能Java语言本身就不合适。随着时间的推移,Java在性能方面已经取得了很多的进步,后来版本中的特性肯定会让Java这门语言在内存这一块处理的更加的高效。