1. 程式人生 > 實用技巧 >JavaEE - 10列舉類

JavaEE - 10列舉類

JavaEE - 10列舉類

(1)列舉類

(1.1)入門

  • 類的物件 只有有限個,確定的如下
    • 星期: Monday(星期一)、......、Sunday(星期天)
    • 性別: Man(男)、Woman(女)
    • 季節: Spring(春季)、......、Winter(冬季)
    • 執行緒狀態:建立、就緒、執行、阻塞、死亡
  • 當需要定義一組常量時,強烈建議使用列舉類

(1.2)列舉類實現

  • JDK1.5之前需要自定義列舉類;JDK1.5之後新增enum關鍵字用於定義列舉類
  • 列舉只有一個物件,則可以作為一種單例模式的實現方式。
  • 列舉值的屬性
    • 列舉值物件的屬性不應允許被改動,所以應該使用private final修飾
    • 列舉類的使用private final修飾的屬性應該在構造器中為其賦值
    • 如列舉類顯式的定義了帶引數的構造器,則在列出列舉值時也必須對應的傳入引數

(1.3)自定義列舉類

//自定義列舉類
public class Season {
    //1. 宣告Season物件的屬性: private final修飾
    private final String seasonName;
    private final String seasonDesc;
    //2. 私有化類的構造器,並給物件屬性賦值
    private Season(String seasonName, String seasonDesc){
        
this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //3. 提供當前列舉類的多個物件 public static final Season SPRING = new Season("春天","春暖花開"); public static final Season SUMMER = new Season("夏天","夏日炎炎"); public static final Season AUTUMN = new Season("秋天","秋高氣爽"); public static
final Season WINTER = new Season("冬天","冬雪皚皚"); // 4. 其他訴求: 獲取列舉類物件的屬性 public String getSeasonName(){ return seasonName; } public String getSeasonDesc(){ return seasonDesc; } }

public class SeasonTest {
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        Season summer = Season.SUMMER;
        System.out.println(spring.getSeasonName() +"-->" + spring.getSeasonDesc());  
        System.out.println(summer.getSeasonName() +"-->" + summer.getSeasonDesc());
    }
}

(1.4)Enum類的方法

方法 詳細描述
values() 返回列舉型別的物件陣列。該方法可以很方便地遍歷所有的列舉值。
valueOf(String str) 可以把一個字串轉化為對應的列舉類物件。要求字串必須是列舉類物件的名字。若不是,執行時異常:IllegalArgumentException。
toString() 返回當前列舉類物件常量的名稱。通過重寫這個方法來使得到的結果更易讀。
equals 在列舉型別中可以直接使用"=="來比較兩個列舉常量是否相等。它的存在是為了在Set、List和Map中使用。equals是不可變的。
hashCode Enum實現了hashCode()來和equals()保持一致。它也是不可變的。
getDeclaringClass 得到列舉常量所屬列舉型別的Class物件。用它來判斷兩個列舉常量是否屬於同一個列舉型別。
name 得到當前列舉常量的名稱。建議優先使用toString()。
ordinal 得到當前列舉常量的次序。
compareTo 列舉型別實現了Compareable介面,可以比較兩個列舉常量的大小(按照宣告的順序排列)
clone 列舉型別不能被Clone。為防止子類實現克隆方法,Enum實現了一個僅丟擲CloneNotSupportedException異常的不變Clone()。

public enum Season1 {
    //3. 提供當前列舉類的多個物件,多個物件之間用","分隔, 末尾物件";"結束。
    SPRING("春天","春暖花開"),
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","秋高氣爽"),
    WINTER("冬天","冬雪皚皚");

    //1. 宣告Season物件的屬性: private final修飾
    private final String seasonName;
    private final String seasonDesc;
    //2. 私有化類的構造器,並給物件屬性賦值
    private Season1(String seasonName, String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

}

public class SeasonTest {
    public static void main(String[] args) {
Season1 summer
= Season1.SUMMER; System.out.println(summer); //SUMMER System.out.println(Season1.class.getSuperclass()); //class java.lang.Enum Season1[] values = Season1.values(); for(int i=0; i< values.length; i++){ System.out.println(values[i]); // SPRING SUMMER autumn WINTER } // Thread State 列舉類 Thread.State[] states = Thread.State.values(); for(int i=0; i< states.length; i++){ System.out.println(states[i]); // NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TERMINATED } // valueOf(String objName): 返回列舉類中物件名為objName的物件 Season1 winter = Season1.valueOf("WINTER"); System.out.println(winter); //WINTER } }

Season1 winter = Season1.valueOf("WINTER1")  // WINTER1 不存在時,報錯

Exception in thread "main" java.lang.IllegalArgumentException: No enum constant Season1.WINTER1
at java.lang.Enum.valueOf(Enum.java:238)
at Season1.valueOf(Season1.java:6)
at SeasonTest.main(SeasonTest.java:30)

(1.5)使用enum關鍵字定義的列舉類實現介面

public interface Info {
    void show();
}

public enum Season1 implements Info {
    //3. 提供當前列舉類的多個物件: public static final 的
    SPRING("春天","春暖花開"){
        public void show(){
            System.out.println("春天在1-3月");
        }
    },
    SUMMER("夏天","夏日炎炎"){
        public void show(){
            System.out.println("夏天在4-6月");
        }
    },
    AUTUMN("秋天","秋高氣爽"){
        public void show(){
            System.out.println("秋天在7-9月");
        }
    },
    WINTER("冬天","冬雪皚皚"){
        public void show(){
            System.out.println("冬天在10-12月");
        }
    };
    // 省略其他程式碼
}

        Season1 winter = Season1.valueOf("WINTER");
        System.out.println(winter);  //WINTER
        winter.show(); //冬天在10-12月