iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0
自我挑戰組

前端工程師的java學習紀錄系列 第 27

Day27-枚舉類enum

  • 分享至 

  • xImage
  •  

Java中的枚舉類指的是,只能創造一定數量的物件,不可以隨便創建新的。

例如:

星期:星期一~星期日

月份:一月~十二月

季節 :春、夏、秋、冬

JDK5.0以前,並沒有提供enum 的關鍵字使用,必須自己定義。

public class Season {
	private final String seasonName;
	private final String seasonDesc;
	
	private Season(String seasonName, String seasonDesc) {
		this.seasonName = seasonName;
		this.seasonDesc = seasonDesc;
	}
	
	public String getSeasonName() {
		return this.seasonName;
	}
	
	public String getSeasonDesc() {
		return this.seasonDesc;
	}
	
	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("冬天", "冬天好冷");
}

public class SeasonTest {
	public static void main(String[] args) {
		System.out.println(Season.SPRING.getSeasonName()); // 春天
	}
}
  1. 透過將屬性 定義成privatefinal 的方式,讓使用的人無法進行修改。
  2. 構造器 定義成private ,無法透過new 的方式將類實例化
  3. 在類中使用public static final 的方式將這幾個所需要的物件實例化為靜態無法更改

JDK5.0開始,可以使用enum 關鍵字去創建枚舉類

public enum Season {

	SPRING("春天", "春天下雨"),
	SUMMER("夏天", "夏天好熱"),
	AUTUMN"秋天", "秋天涼快"),
	WINTER("冬天", "冬天好冷");

	private final String seasonName;
	private final String seasonDesc;
	
	private Season(String seasonName, String seasonDesc) {
		this.seasonName = seasonName;
		this.seasonDesc = seasonDesc;
	}
	
	public String getSeasonName() {
		return this.seasonName;
	}
	
	public String getSeasonDesc() {
		return this.seasonDesc;
	}
	

}

public class SeasonTest {
	public static void main(String[] args) {
		System.out.println(Season.SPRING.getSeasonName()); // 春天
	}
}

直接在enum最上方使用實例名稱()並且用,將不同的實例分隔即可,也可以將要賦值的部分直接寫在()

使用enum 實作interface 時有兩種情況:

共用同一個實作方法

interface A {
	void method() {}
}

enum B implements A {
	Z,Y,X;
	void method() {
		System.out.println("B");
	}
}

public class BTest {
	public static void main(String[] args) {
		B.Z.method(); // B
		B.Y.method(); // B
		B.X.method(); // B
	}
}

將實作的方法寫在enum B 中時,enum B 中實例化的ZYX 使用同一個method()

單獨使用自己的實作方法

interface A {
	void method() {}
}

enum B implements A {
	Z() {
		void method() {
			System.out.println("Z");
		}
	},
	Y() {
		void method() {
			System.out.println("Y");
		}
	},
	X() {
		void method() {
			System.out.println("X");
		}
	};
	void method() {}
}

public class BTest {
	public static void main(String[] args) {
		B.Z.method(); // Z
		B.Y.method(); // Y
		B.X.method(); // X
	}
}

透過這樣的方式,可以在各自的實例中,實作interface A 中的method() 方法。

Enum 本身也是屬於一個類,並且也是繼承java.lang.Ojbect ,當中有幾個常用的靜態方法

  1. toString() :預設是會返回實例 的名稱。如:B.Z.toString(); 會返回Z
  2. values() :返回該enum 類型的陣列。如:B.values(); 會返回[{Z},{Y},{X}]
  3. valuesOf(String objName) :返回該enum 類型的objName 實例。如:B.valueOf("Z"); 會返回Z 的實例,若該enum 中沒有objName 的實例會出現IllegalArgumentException 的錯誤(參數錯誤的意思)而不是null

上一篇
Day26-內部類、匿名類
下一篇
Day28-註解Annotation、包裝類
系列文
前端工程師的java學習紀錄37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言