JAVA中的枚举类型总是会让初学者有些害怕。由于C语言的惯性思维,导致很多人总是不能很好的理解JAVA中的枚举类型的原理。本文就从模拟枚举类型的实现的角度来学习枚举类型。
JAVA中的枚举:
1.枚举类型是一种取值被严格限定在一个有限的集合中的变量类型。
2.java中的枚举是一种特殊的类。每一个枚举都会被编译成一个class文件。
3.枚举主要用于限定变量的取值,从而从根源上有效的避免了非法的赋值。
4.声明一个枚举的方式为 public enum Sex{ MALE,FEMALE } ,在使用时即可使用Sex.MALE和Sex.FEMALE。
下面我们来模拟Enum:
public class Weekday {
//构造方法必须私有
//保证其他任何类都不能创建Weekday的实例
private Weekday(){}
//在静态初始化的时候创建对象
//引用必须是共有的静态的
public static Weekday SUN = new Weekday();
public static Weekday MON = new Weekday();
public static Weekday TUE = new Weekday();
public static Weekday WED = new Weekday();
public static Weekday THU = new Weekday();
public static Weekday FRI = new Weekday();
public static Weekday SAT = new Weekday();
}
然后我们就可以使用它了,使用起来和Enum没有什么区别。
Weekday weekday = Weekday.SUN;
而且weekday 的值只能从集合{SUN,MON,TUE,WED,THU,FRI,SAT}中取,而不能被我们随便定义。
实际上,enum就是用类似的方法实现的。
如何使用有参数的枚举类型:
有时候,我们需要将枚举类型的值与int类型的值相对应,这时候,我们就需要给每个枚举对象一个int类型的value。这是可以通过重写enum类型的构造方法来实现。如:
public enum Weekday {
SUN(0);
MON(1);
TUE(2);
private int value;
private Weekday(int value){
this.value=value;
}
public int getValue(){
return value;
}
public static WeekDay getDay(int value){
switch(value){
case 0:return WeekDay.SUN;
case 1:return WeekDay.MON;
case 2:return WeekDay.TUE;
default:return null;
}
}
对照上面的代码,是不是这个有参数的枚举类型也很容易理解?
其实java类的枚举类型实现也是通过类似的语法糖实现的而已,所有的enum类编译之后都是一个继承java.lang.Enum的类而已。不信我们可以在上面的这个类中添加个方法试下:
public static void main(String[] args) {
System.out.println(SUN instanceof Enum);
}
输出结果肯定为true.