【Java】枚舉

目錄

多例與枚舉

Enum類

枚舉中定義其他結構

枚舉應用


多例與枚舉

多例設計模式:構造方法私有化,內部提供有若干個實例化對象,通過static方法返回

例:設計一個描述顏色基色的多例類

class Color {
	private static final Color RED = new Color("RED");
	private static final Color GREEN = new Color("GREEN");
	private static final Color BLUE = new Color("BLUE");
	private String title;
	
	private Color(String title) { //構造方法私有化
		this.title = title;
	}
	
	public static Color getInstance(int ch) {
		switch(ch) {
			case 0:
				return RED;
			case 1:
				return GREEN;
			case 2:
				return BLUE;
			default:
				return null;
		}
	}
	
	public String toString() {
		return this.title;
	}
}


public class TestDemo {
	public static void main(String[] args) {
		System.out.println(Color.getInstance(0));
	}
}

這是JDK1.5之前的做法,目的是限制本類實例化對象的產生個數。但是從JDK1.5開始有了枚舉, 以上代碼基於枚舉開發編寫如下:

enum Color {
	RED,GREEN,BLUE;
}

public class TestDemo {
	public static void main(String[] args) {
		System.out.println(Color.RED);
	}
}

輸出結果和上面的多例代碼一致,都輸出RED。

從中可以看出,所謂枚舉就是一種高級的多例設計模式。

Enum類

關鍵字定義的JDK1.5提供了enum關鍵字,但是enum並不是一種新的結構,相反它只是對一種類型的包裝:使用enum關鍵字定義的枚舉類本質上 就相當於一個class定義的類繼承了java.lang.Enum父類。

Enum類中有以下方法:

  • 構造方法:protected Enum(String name, int ordinal)

          當定義枚舉類中的對象時自動設置序號和名字

  • 取得枚舉名字:public final String name()
  • 取得枚舉序號:public final int ordinal()

例:觀察方法的使用

enum Color {
	RED,GREEN,BLUE
}

public class TestDemo {
	public static void main(String[] args) {
		System.out.println(Color.RED.ordinal() + "=" + Color.RED.name());
	}
}

輸出結果:0=RED

如果調用enum中的順序爲:

enum Color {
	GREEN,RED,BLUE
}

public class TestDemo {
	public static void main(String[] args) {
		System.out.println(Color.RED.ordinal() + "=" + Color.RED.name());
	}
}

輸出結果爲:1=RED

Enum中還有方法可以取得所有的枚舉數據:values()返回的是一個枚舉的對象數組。

例:取得所有的枚舉數據

enum Color {
	GREEN,RED,BLUE
}

public class TestDemo {
	public static void main(String[] args) {
		for(Color temp: Color.values()) {
			System.out.println(temp.ordinal() + "=" + temp.name());
		}
	}
}

輸出結果:

0=GREEN
1=RED
2=BLUE

面試題:請解釋enum和Enum的區別

  • enum是一個關鍵字,使用enum定義的枚舉類本質上就相當於一個類繼承了Enum這個抽象類

枚舉中定義其他結構

多例是在類中產生的,其中可定義方法,考慮到這個因素,設計了枚舉方案:可以在枚舉裏定義屬性、方法等。

enum Color {
	//因爲沒有無參構造函數
	RED("紅色"),GREEN("綠色"),BLUE("藍色"); //如果定義有很多內容,枚舉對象必須寫在第一行
	private String title;
	private Color(String title) { //構造方法絕對不能夠使用public
		this.title = title;
	}
	
	public String toString() { //覆寫Object中的方法
		return this.title;
	}
}

public class TestDemo {
	public static void main(String[] args) {
		System.out.println(Color.RED);
	}
}

輸出結果爲:紅色

枚舉本身還可以實現接口,這樣枚舉中的每一個對象實際上就都變爲了接口對象。

例:讓枚舉實現接口

interface IColor{
	public String getColor();
}
enum Color implements IColor{ //實現了IColor接口
	//因爲沒有無參構造函數
	RED("紅色"),GREEN("綠色"),BLUE("藍色"); //如果定義有很多內容,枚舉對象必須寫在第一行
	private String title;
	private Color(String title) { //構造方法絕對不能夠使用public
		this.title = title;
	}
	
	public String toString() { //覆寫Object中的方法
		return this.title;
	}

	@Override
	public String getColor() {
		return this.title;
	}
}

public class TestDemo {
	public static void main(String[] args) {
		IColor ic = Color.GREEN;
		System.out.println(ic.getColor() );
	}
}

輸出結果爲:綠色

這些只能說是枚舉的擴展特點,其他語言裏的枚舉沒這麼高級。

枚舉應用

枚舉最大的特點是隻有指定的幾個對象可以使用。枚舉還支持switch:

enum Sex {
	MALE,FEMALE;
}
public class TestDemo {
	public static void main(String[] args) {
		switch(Sex.MALE) {
			case MALE: //不能寫成Sex.MALE
				System.out.println("是男人");
				break;
			case FEMALE:
				System.out.println("是女人");
				break;
		}
	}
}

 

發佈了154 篇原創文章 · 獲贊 48 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章