枚举的几种使用案例(简单,进阶,switch,单例)

首先,应该注意:
1>.枚举类型都隐式继承了java.lang.Enum类,因此不能继承其他类,但可以实现接口;
2>.枚举类型只能有私有的构造方法(java运行时创建,外部不能进行实例化);
3>不能泛型化;
4>当有字段和方法时,枚举常量的列表必须以分号结尾;
5>编译器在创建枚举时会自动添加一些特殊方法。例如,它们具有一个静态values方法和valueOf(String)方法

例子一(反编译(反汇编).class文件判断):
写一个java类名为:enumTest.java
enum Day{
        DAY,MOUTH,YEAR
}
public class enumTest {
        public static void main(String[] args) {
                Day day = Day.DAY;
        }
}

1.javac编译:javac enumTest.java
枚举的几种使用案例(简单,进阶,switch,单例)
产生两个.class 文件:Day.class  enumTest.class
枚举的几种使用案例(简单,进阶,switch,单例)
2.反编译Day.class ,发现原本写在enumTest.java文件中的enum类型的Day,被编译为了一个继承了Enum类的final类,里面的关键字也被编译为了static final类型的变量。还包含values()与valueOf(String)方法。
枚举的几种使用案例(简单,进阶,switch,单例)
反汇编Day.class为字节码
枚举的几种使用案例(简单,进阶,switch,单例)枚举的几种使用案例(简单,进阶,switch,单例)
3.反编译enumTest.class   在该类中enum Day已经不再该类中,被单独编译一个类
枚举的几种使用案例(简单,进阶,switch,单例)
反汇编enumTest.class 为字节码
枚举的几种使用案例(简单,进阶,switch,单例)

例子二(实际使用):
package cn.yoylee.test;

import java.util.Arrays;

/*简单使用*/
//public enum Day{
        // DAY,MOUTH,YEAR;
//}

/*进阶使用1*/
//enum Day{
//      DAY("天"),MOUTH("月"),YEAR("年"); //以分号结束(因为后面跟有方法)
//
//      private String value;
//
//      Day(String str){
//          this.value = str;
//      }
//
//      public String getValue(){
//         return value;
//      }
//}

/*进阶使用2*/
enum Day{

    DAY{
            public String getInfo(){
            return "天";
            }
};

    /**
    * 定义抽象方法
    * @return
    */
    public abstract String getInfo();
}
public class enumTest {

    public static void main(String[] args) {
        /*简单使用测试 */
        // Day day = Day.DAY;
        // //测试Enum的values()方法
        // System.out.println(Arrays.toString(Day.values()));

        /*进阶使用测试1*/
        // for (Day day : Day.values()){
        // System.out.println("参数名称:"+day.name()+" 参数值:"+day.getValue());
        // }

        /*进阶使用2*/
        System.out.println(Day.DAY.getInfo());

       }
}
package cn.yoylee.test;

public enum EnumTest3 {

        SYSTEM_NORMAL(200, "系统正常"),
        //异常 返回码范围 400 -419 业务无关异常
        INVALID_PARAM(401,"无效参数"),
        //服务端异常
        SERVICE_ERROR(500, "服务异常");
        private int code;
        private String desc;
        EnumTest3(int code, String desc) {
            this.code = code;
            this.desc = desc;
        }
        public int getCode() {
                return code;
        }
        public void setCode(int code) {
                this.code = code;
        }
        public String getDesc() {
                return desc;
        }
        public void setDesc(String desc) {
            this.desc = desc;
        }
        public static void main(String[] args) {
            for (EnumTest3 para : EnumTest3.values()){
                System.out.println("错误代码为:"+para.getCode()+" 错误信息:"+para.getDesc());
            }
        }

/**
* 输出:
* 错误代码为:200 错误信息:系统正常
错误代码为:401 错误信息:无效参数
错误代码为:500 错误信息:服务异常
*/
}

例子三(enum与switch):

enum Color {GREEN,RED,BLUE}

public class EnumTest2 {

    public static void printName(Color color){
        switch (color){
            case BLUE: //无需使用Color进行引用
                System.out.println("蓝色");
                break;
            case RED:
                System.out.println("红色");
                break;
            case GREEN:
                System.out.println("绿色");
                break;
        }
    }

    public static void main(String[] args){
        printName(Color.BLUE);
        printName(Color.RED);
        printName(Color.GREEN);

        /*输出*/
        //蓝色
        //红色
        //绿色
    }
}
例子四(enum与单例模式):
1.利用enum实现的单例模式类:EnumTest4_Signal
package cn.yoylee.test;

public enum EnumTest4_Signal {

        //自定义一个枚举的元素,代表EnumTest4_Signal类的实例
        INSTANCE;

        //单例可以有自己的操作
        public void otherMethods(){
            //功能处理
        }
}
2.测试enum实现的单例模式的类:EnumTest4_use
package cn.yoylee.test;

/**
* 测试enum实现的单例模式
*/
public class EnumTest4_use {

    public static void main(String[] args) {

        //用enum实现的单利模式类:EnumTest4_Signal
        EnumTest4_Signal instance = EnumTest4_Signal.INSTANCE;
        EnumTest4_Signal instance1 = EnumTest4_Signal.INSTANCE;
        System.out.println("instance对象的hash值为:"+instance.hashCode());
        System.out.println("instance1对象的hash值为:"+instance1.hashCode());
        System.out.println("是否为同一个对象:"+(instance.hashCode()==instance1.hashCode()));

        //非单例模式的类:EnumTest2
        EnumTest2 enumTest = new EnumTest2();
        EnumTest2 enumTest1 = new EnumTest2();
        System.out.println("enumTest对象的hash值为:"+enumTest.hashCode());
        System.out.println("enumTest1对象的hash值为:"+enumTest1.hashCode());
        System.out.println("是否为同一个对象:"+(enumTest.hashCode()==enumTest1.hashCode()));

        /**
        * 输出:
        *      instance对象的hash值为:1163157884
                instance1对象的hash值为:1163157884
               是否为同一个对象:true
               enumTest对象的hash值为:1956725890
               enumTest1对象的hash值为:356573597
               是否为同一个对象:false
        */
    
    }
}