列舉的幾種使用案例(簡單,進階,switch,單例)

yoylee_web發表於2018-07-03
首先,應該注意:
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
產生兩個.class 檔案:Day.class  enumTest.class
2.反編譯Day.class ,發現原本寫在enumTest.java檔案中的enum型別的Day,被編譯為了一個繼承了Enum類的final類,裡面的關鍵字也被編譯為了static final型別的變數。還包含values()與valueOf(String)方法。
反彙編Day.class為位元組碼
3.反編譯enumTest.class   在該類中enum Day已經不再該類中,被單獨編譯一個類
反彙編enumTest.class 為位元組碼

例子二(實際使用):
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
        */
    
    }
}

相關文章