副标题#e#
Enum作为Sun全新引进的一个要害字,看起来很象是非凡的class, 它也可以有本身的变量,可以界说本身的要领,可以实现一个可能多个接口。 当我们在声明一个enum范例时,我们应该留意到enum范例有如下的一些特征。
1.它不能有public的结构函数,这样做可以担保客户代码没有步伐新建一个enum的实例。
2.所有列举值都是public , static , final的。留意这一点只是针对付列举值,我们可以和在普通类内里界说 变量一样界说其它任何范例的非列举变量,这些变量可以用任何你想用的修饰符。
3.Enum默认实现了java.lang.Comparable接口。
4.Enum覆载了了toString要领,因此我们假如挪用Color.Blue.toString()默认返回字符串”Blue”.
5.Enum提供了一个valueOf要领,这个要领和toString要领是相对应的。挪用valueOf(“Blue”)将返回Color.Blue.因此我们在本身重写toString要领的时候就要留意到这一点,一把来说应该相对应地重写valueOf要领。
6.Enum还提供了values要领,这个要领使你可以或许利便的遍历所有的列举值。
7.Enum尚有一个oridinal的要领,这个要领返回列举值在列举类种的顺序,这个顺序按照列举值声明的顺序而定,这里Color.Red.ordinal()返回0。
相识了这些根基特性,我们来看看如何利用它们。
1.遍历所有有列举值. 知道了有values要领,我们可以轻车熟路地用ForEach轮回来遍历了列举值了。
for (Color c: Color.values())
System.out.println(“find value:” + c);
2.在enum中界说要领和变量,好比我们可觉得Color增加一个要领随机返回一个颜色。
public enum Color {
Red,
Green,
Blue;
/*
*界说一个变量暗示列举值的数目。
*(我有点奇怪为什么sun没有给enum直接提供一个size要领).
*/
private static int number = Color.values().length ;
/**
* 随机返回一个列举值
@return a random enum value.
*/
public static Color getRandomColor(){
long random = System.currentTimeMillis() % number;
switch ((int) random){
case 0:
return Color.Red;
case 1:
return Color.Green;
case 2:
return Color.Blue;
default : return Color.Red;
}
}
}
可以看出这在列举范例里界说变量和要领和在普通类内里界说要领和变量没有什么区别。独一要留意的只是变量和要领界说必需放在所有列举值界说的后头,不然编译器会给出一个错误。
#p#副标题#e#
3.覆载(Override)toString, valueOf要领
前面我们已经知道enum提供了toString,valueOf等要领,许多时候我们都需要覆载默认的toString要领,那么对付enum我们怎么做呢。其实这和覆载一个普通class的toString要领没有什么区别。
….
public String toString(){
switch (this){
case Red:
return "Color.Red";
case Green:
return "Color.Green";
case Blue:
return "Color.Blue";
default:
return "Unknow Color";
}
}
….
这时我们可以看到,此时再用前面的遍历代码打印出来的是
Color.Red
Color.Green
Color.Blue
而不是
Red
Green
Blue.
可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf要领,以保持它们彼此的一致性。
4.利用结构函数
固然enum不行以有public的结构函数,可是我们照旧可以界说private的结构函数,在enum内部利用。照旧用Color这个例子。
public enum Color {
Red("This is Red"),
Green("This is Green"),
Blue("This is Blue");
private String desc;
Color(String desc){
this.desc = desc;
}
public String getDesc(){
return this.desc;
}
}
这里我们为每一个颜色提供了一个说明信息, 然后界说了一个结构函数接管这个说明信息。
要留意这里结构函数不能为public可能protected, 从而担保结构函数只能在内部利用,客户代码不能new一个列举值的实例出来。这也是完全切合情理的,因为我们知道列举值是public static final的常量罢了。
5.实现特定的接口
我们已经知道enum可以界说变量和要领,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。
6.界说列举值本身的要领。
前面我们看到可觉得enum界说一些要领,其实我们甚至可觉得每一个列举值界说要领。这样,我们前面覆载 toString的例子可以被改写成这样。
#p#分页标题#e#
public enum Color {
Red {
public String toString(){
return "Color.Red";
}
},
Green {
public String toString(){
return "Color.Green";
}
},
Blue{
public String toString(){
return "Color.Blue";
}
};
}
从逻辑上来说这样比原先提供一个“全局“的toString要领要清晰一些。
总的来说,enum作为一个全新界说的范例,是但愿可以或许辅佐措施员写出的代码越发简朴易懂,小我私家以为一般也不需要过多的利用enum的一些高级特性,不然就和简朴易懂的初志想违背了。
(以上代码在win2k+ 1.5.0-beta2-b51下运行通过)