java中的枚举类
java中为了对参数类型使用限定,引入了泛型,实现了在编译期对参数类型是否合法的判断。同样,java为了对参数的值的限定,引入了枚举类,实现了在编译期对参数的值是否合法的判断。
首先我们用自定义类的方法实现枚举类,可以参考单例模式的实现思路,将类的构造方法设置为私有的,在类内部定义static的变量,只能直接通过类名访问自己定义的类,实现对类的值的限定。
1 public class TestEnum {
2
3 public static void main(String[] args) {
4 Weekday w = Weekday.Fri;
5 System.out.println(w);
6 System.out.println(Weekday.s);
7
8 }
9 }
10
11 class Weekday{
12 String weekday = null;
13 private Weekday(String str){
14 this.weekday = str;
15 }
16 static int s = 3000;
17 public static Weekday Sun = new Weekday("Sunday");
18 public static Weekday Mon = new Weekday("Monday");
19 public static Weekday Tues = new Weekday("Tuesday");
20 public static Weekday Wed = new Weekday("Wednesday");
21 public static Weekday Thu = new Weekday("Thurday");
22 public static Weekday Fri = new Weekday("Friday");
23 public static Weekday Sat = new Weekday("Saturday");
24
25 @Override
26 public String toString(){
27 return this.weekday;
28 }
29
30
31 }
使用的时候,每调用一次static属性,就创建了一个实例。静态的成员可以通过类名直接访问。
java中用enum表示枚举类,我们通过例子学习:
1 public class TestEnum1 {
2 public static void main(String[] args) {
3 // TODO Auto-generated method stub
4 Num n = Num.Six;
5 System.out.println(n);
6 System.out.println(n.ordinal());//表示的数字,从0开始。
7 System.out.println(Weekday1.FRI);
8 System.out.println(Weekday1.FRI.nextDay().nextDay());
9 System.out.println(Weekday1.FRI.nextDay().nextDay().ordinal());
10 }
11 }
12
13 enum Num{
14 Zero,One,Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten;
15 Num() {
16 System.out.println("this is null parameter constructor func");
17 }
18 }
19
20 enum Weekday1{
21 SUN("Sunday"),MON("Monday"),TUE("Tuesday"),WED("Wednesday"),THU("Thurday"),FRI("Friday"),SAT("Saturday");
22 String weekday1 = null;
23 Weekday1(String weekday1){
24 this.weekday1 = weekday1;
25 }
26 @Override
27 public String toString(){
28 return this.weekday1;
29 }
30 public Weekday1 nextDay() {
31 switch (this) {
32 case SUN:
33 return MON;
34 case MON:
35 return TUE;
36 case TUE:
37 return WED;
38 case WED:
39 return THU;
40 case THU:
41 return FRI;
42 case FRI:
43 return SAT;
44 default:
45 return SUN;
46 }
47
48 }
49 }
通过两个类的比较和输出可以总结出:
enum是一个特殊的类,他定义了自己的常量,而且类型是自己,默认的toString方法是把自己的名字转换成string。
enum也有普通类的大部分用法,包括构造函数,私有变量,抽象函数(比如匿名内部类实现),不过用自定义成员的时候。必须把枚举常量放在枚举类的第一行。每个枚举常量在定义的时候使用了一次构造函数,在其他类中调用的时候也会再调用一次构造函数,两次的值一样,但是指向的实际对象其实是不一样的(可以通过构造函数的打印次数得出此结论)。ordinal()函数返回枚举常量的序数(在声明中的位置,初始常量的序数是0),被设计用于复杂的基于enum的数据结构。