java枚举类Enum⽅法简介(valueof,value,ordinal)
转⾃blog.csdn/congqingbin/article/details/7520137
Enum作为Sun全新引进的⼀个关键字,看起来很象是特殊的class, 它也可以有⾃⼰的变量,可以定义⾃⼰的⽅法,可以实现⼀个或者多个接⼝。当我们在声明⼀个enum类型时,我们应该注意到enum类型有如下的⼀些特征。
1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建⼀个enum的实例。
2.所有枚举值都是public , static , final的。注意这⼀点只是针对于枚举值,我们可以和在普通类⾥⾯定义变量⼀样定义其它任何类型的⾮枚举变量,这些变量可以⽤任何你想⽤的修饰符。
3.Enum默认实现了java.lang.Comparable接⼝。
4.Enum覆载了了toString⽅法,因此我们如果调⽤String()默认返回字符串”Blue”.
5.Enum提供了⼀个valueOf⽅法,这个⽅法和toString⽅法是相对应的。调⽤valueOf(“Blue”)将返回Color.Blue.因此我们在⾃⼰重写toString⽅法的时候就要注意到这⼀点,⼀把来说应该相对应地重写valueOf⽅法。
6.Enum还提供了values⽅法,这个⽅法使你能够⽅便的遍历所有的枚举值。
7.Enum还有⼀个oridinal的⽅法,这个⽅法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序⽽定,这⾥
dinal()返回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:
java接口有没有构造方法 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 的⼀些⾼级特性,否则就和简单易懂的初衷想违背了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论