1.
2.
3 .
4.
5.
6.
7.
了解了这些基本特性,我们来看看如何使用它们。
1.for (Color c: Color.values())
System.out.println(“find value:” + c);
2.
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.
前面我们已经知道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内部使用。还是用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的一些高级特性,否则就和简单易懂的初衷想违背了。
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Student name=Student.ROBIN;
System.out.println("name:"+name);
for (Student st:Student.values())
System.out.println(st.name);
}
}
enum Student
{
ROBIN("robin"),
HARRY("harry",40),
ROBBIE("robbie");
String name;
int age;
private Student(String name)
{
this (name,0);
}
private Student(String name,int age)
{
this.name=name;
this.age=age;
}
}
转自:http://blog.youkuaiyun.com/hudashi/article/details/6936978
4415



被折叠的 条评论
为什么被折叠?



