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;
}
}
}
能够看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。惟一要注意的只是变量和方法定义必须放在全部枚举值定义的后面,不然编译器会给出一个错误。
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的例子能够被改写成这样。
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的一些高级特性,不然就和简单易懂的初衷想违背了。
java