Java Enum 枚举类

Java Enum 枚举类及其用法(2017.09.12)

  • 语法定义:创建枚举类型要使用enum关键字,隐含了所创建的类型都是java.lang.Enum类的子类(java.lang.Enum是一个抽象类)。枚举类型符合通用模式Class Enum<E extends Enum<E>>,而E表示枚举类型的名称。枚举类型的每一个值都将映射到protect Enum(String name, int ordinal)构造函数中,在这里,每个值得名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
  • Example:

public enum EnumTest{
    MON, TUE, WED, THU, FRI, SAT, SUN;
}
   上面的代码实际上调用了7次Enum(String name, int ordinal); 

new Enum<EnumTest>("MON", 0);
new Enum<EnumTest>("TUE", 1);
......
  • 遍历、switch等常用操作

public class Test{
    public static void main(String[] args){
        for(EnumTest e : EnumTest.values()){
            System.out.println(e.toString());//依次输出MON TUE WED .....
        }

        //switch操作
        EnumTest test = EnumTest.TUE;
        switch(test){
        case MON:
            syso("今天是星期一");
            break;
        case TUE:
            syso("今天是星期二");
            break;
        ......
        default:
            syso(test);
            break;     
        }
        //上面输出 今天是星期二
        //case MON 也是EnumTest里面存在的
    }
}

  • compareTo(E o)
  • getDeclaringClass()
  • name()
  • ordinal()
  • toString()
  • valueOf()
  • 给enum自定义属性和方法:(给enum对象添加value的属性和getValue()的方法PS:名字可以自定义)
  • Example

public enum EnumTest{
    MON(1), TUE(2), WED(3), THU(4), FRI(5),SAT(6){
        @Override
        public boolean isReset(){
            return true;    
        }
    },
    SUN(0){
        @Override
        public boolean isRest(){
            return true;
        }
    };

    private int value;

    private EnumTest(int Value){
        this.value = value;
    }

    public int getValue(){
        return value;
    }

    public boolean isRest(){
        return false;
    }
}

    上面代码的MON、TUE等像是继承EnumTest的实现,继承了value属性,及其方法。
public class Test{
    public static void main(String[] args){
        syso(EnumTest.FRI.getValue());    //输出 5
    }
}

  • EnumSet、EnumMap的应用
  • Example

public class Test{
    public static void main(){
        //EnumSet的使用
        EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);
        for(EnumTest day : weekSet){
            syso(day); //输出 MON、TUE.....
        }

        //EnumMap的使用
        EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);
        weekMap.put(EnumTest.MON, "星期一");
        weekMap.put(EnumTest.TUE, "星期二");
        ......
        for(Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet(),iterator(); iter,hasNext()){
            Entry<EnumTest, String> entry = iter.next();
            syso(entry.getKey().name() + " : " + entry,getValue());
            //输出 MON : 星期一  ......
        }
    }
}

  • 原理分析:enum的语法结构尽管和class的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。EnumTest经过反编译(javap com.xx.xx.EnumTest 命令)之后得到的内容如下:
public   class   com.hmw.test.EnumTest extends   java.lang.Enum{
     public   static   final   com.hmw.test.EnumTest MON;
     public   static   final   com.hmw.test.EnumTest TUE;
     public   static   final   com.hmw.test.EnumTest WED;
     public   static   final   com.hmw.test.EnumTest THU;
     public   static   final   com.hmw.test.EnumTest FRI;
     public   static   final   com.hmw.test.EnumTest SAT;
     public   static   final   com.hmw.test.EnumTest SUN;
     static   {};
     public   int   getValue();
     public   boolean   isRest();
     public   static   com.hmw.test.EnumTest[] values();
     public   static   com.hmw.test.EnumTest valueOf(java.lang.String);
     com.hmw.test.EnumTest(java.lang.String, int , int , com.hmw.test.EnumTest);
}
    所以,实际上 enum就是一个 class, 只不过java编译器帮我们做了语法的解析和编译而已。

  • 总结:可以把enum看成是一个普通的class,它们都可以定义一些属性和方法,不同之处是:enum不能使用extends关键字继承其他类,因为enum已经继承了 java.lang.Enum。(java是单一继承!)
  • 笔记参考链接:http://www.cnblogs.com/hyl8218/p/5088287.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值