iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0

枚舉(Enum)

定義

也可以稱為列舉,枚舉是Java中的一種特殊數據類型,它代表了一個固定數量的命名常數。枚舉常數在聲明時列舉出並具有唯一的名稱,定義在該型別裡的值是固定不能變動的,只能是列舉出來的幾種,不可以是其他未列出的值。

用途

定義常數集合-物件有限且固定,例如:一週有七天,一年四個季節

提高代碼的可讀性,使代碼更具表達力。

在switch語句中使用,以簡化多分支邏輯。

注意事項:

  1. 編譯後仍會產生*.class 類別檔。
  2. Enum無法繼承與被繼承,但在編譯時期會隱藏性的繼承Enum 抽象類別。每個列舉型別成員預設是public static final ,但撰寫時可以不指定,但要全大寫
  3. 若要使用列舉值時,必須加上類型別名稱或物件變數,例如 c.Large 或CupSize.Medium 。列舉值在輸出為字串時, 則會自動轉換為列舉的名稱, 例如 CupSize.Medium 就會輸出為 "Medium"。
  4. 列舉型別不可使用 new 來建立新物件 (因為其建構方法為 private, 只能在類別內部建構,不會隨意被更動)
  5. 列舉型別也可以定義在類別之內,也可以在類別之外
  6. 列舉型別可以實做介面,例如enum Color implements MyColor{ ... },但必須在enum 中實做介面的方法。
  7. 在 enum 中必須將列舉值串列寫在最前面,並以分號結束。列舉值之後若有加小括號及參數, 則會呼叫自訂的建構方法來建立物件。

以下以季節當作例子:

以前


public class OldSeason {
    public static final int SPRING = 1;
    public static final int SUMMER = 2;
    public static final int FALL = 3;
		public static final int WINTER = 4;
}

用enum表示:


enum Season {

		//第一行宣告物件:強制加上public static final
	    SPRING, SUMMER, FALL, WINTER;
		//背後會做的事
		//Season SPRING = new Season();
		//Season SUMMER = new Season();
		//Season FALL = new Season();
		//Season WINTER = new Season();
		
		String weather;
		void info(){
			System.out.println(weather);
		}
		//權限不可是public 預設是private
		Season() {
			System.out.println("OK");
		}
	}
public static void main(String[] args) {
		//直接使用其物件
		System.out.println(Season.SPRING.weather);
	}

/*
輸出結果:
OK
OK
OK
OK
null
*/

以上會產生這麼多7個OK是因為預設會先像Season SPRING = new Season();把物件建立起來,就會預先跑建構子

如果遇到Enum名稱較長的狀況可以用間接使用的方法

public static void main(String[] args) {
		//直接使用其物件
		System.out.println(Season.SPRING.weather);
		//間接以代號使用
		Season s1 = Season.SPRING;
		System.out.println(s1.weather);

	}
/*
輸出結果:
OK
OK
OK
OK
null
null
*/

如果要初始化weather的話可以透過給建構子參數的方式,如以下:

enum Season {

		//第一行宣告物件:強制加上public static final
	    SPRING("春天"), SUMMER("夏天"), FALL("秋天"), WINTER("冬天");
		//背後會做的事
		//Day SUNDAY = new Day();
		//Day MONDAY = new Day();
		//Day TUESDAY = new Day();
		//Day SATURDAY = new Day();
		
		String weather;
		void info(){
			System.out.println(weather);
		}
		Season(String w) {
			this.weather = w;
			System.out.println("OK");
		}
	}
public static void main(String[] args) {
		//直接使用其物件
		System.out.println(Season.SPRING.weather);
		//間接以代號使用
		Season s1 = Season.SPRING;
		System.out.println(s1.weather);

	}
/*
輸出結果:
OK
OK
OK
OK
春天
春天
*/

迭代枚舉元素.values()

//不存在的會報錯 IllegalArgumentException
System.out.println(Season.valueOf("FALL"));

/*
輸出結果:
FALL
*/

搭配前面提到流程控制的switch條件句,判斷枚舉資料

public static void main(String[] args) {
	Season s1 = Season.SPRING;
	switch(s1){
				case SPRING:
					System.out.println("春天"); 
					break;
				case SUMMER:
					System.out.println("夏天"); 
					break;
				case FALL:
					System.out.println("秋天");
					break; 
				case WINTER:
					System.out.println("冬天");
					break; 
			}
}
/*
輸出結果:
春天
*/

枚舉是Java中一個強大且有用的特性,用於表示一組相關的常數值。它們提高了代碼的可讀性、類型安全性和維護性,特別適用於表示有限的選項或狀態的情況。當您需要定義一組常數值時,應該考慮使用枚舉,因為它們可以幫助改善代碼的質量並減少潛在的錯誤。


上一篇
Day 21 其他類 I
下一篇
Day 23 其他類 III
系列文
玩轉Java:從基礎打造你的程式超能力30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言