枚举类型模拟

来源:互联网 发布:淘宝虚拟物品货源 编辑:程序博客网 时间:2024/06/01 20:43

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.

0 0
原创粉丝点击