JavaEE - 10列舉類
阿新 • • 發佈:2020-12-08
JavaEE - 10列舉類
(1)列舉類
(1.1)入門
- 類的物件 只有有限個,確定的。如下
- 星期: Monday(星期一)、......、Sunday(星期天)
- 性別: Man(男)、Woman(女)
- 季節: Spring(春季)、......、Winter(冬季)
- 執行緒狀態:建立、就緒、執行、阻塞、死亡
- 當需要定義一組常量時,強烈建議使用列舉類。
(1.2)列舉類實現
- JDK1.5之前需要自定義列舉類;JDK1.5之後新增enum關鍵字用於定義列舉類
- 列舉只有一個物件,則可以作為一種單例模式的實現方式。
- 列舉值的屬性
- 列舉值物件的屬性不應允許被改動,所以應該使用private final修飾
- 列舉類的使用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 staticfinal 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月