01 25Java中級之枚舉

1 定義枚舉類

JDK 1.5之後出現枚舉,在實際的開發之中,枚舉的作用是用於定義有限個數對象的一種結構(多例設計模式)。枚舉就屬於多例設計,並且其結構要比多例設計更加的簡潔。

在程序之中提供有enum的關鍵字,利用此關鍵字可以實現枚舉的定義。
範例:定義一個枚舉

enum Color{
	RED, GREEN, BLUE;
}

public class JavaDemo{

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

枚舉和多例設計模式可以實現同樣的需求,但是枚舉在編譯時可以檢查出錯誤的請求,而多例設計模式只能在運行時出現異常。另外,在進行枚舉處理的時候,還可以利用values()方法獲取所有的枚舉對象進行輸出。
範例:獲取所有的枚舉對象

enum Color{
	RED, GREEN, BLUE;
}

public class JavaDemo{

	public static void main(String[] args){
		for(Color temp : Color.values()){
			System.out.println(temp);
		}
	}
}

從JDK 1.5追加了枚舉結構之後,,就可以在switch之中進行枚舉項的判斷。
範例:觀察枚舉與switch處理

enum Color{
	RED, GREEN, BLUE;
}

public class JavaDemo{

	public static void main(String[] args){
		Color co = Color.RED;
		switch(co){
			case RED: System.out.println("red");break;
			case GREEN: System.out.println("red");break;
			case BLUE: System.out.println("red");break;
			default: break;
		}

	}
}

2 Enum類

嚴格意義上來講枚舉並不是一種新的結構,它的本質相當於一個類,但是這個類默認會繼承Enum類,Enum類的定義如下:

public abstract class Enum<E extends Enum<E>>
extends Object
implements Comparable<E>, Serializable

現在定義的枚舉類的類型就是Enum中所使用的E類型。以下是Enum類的部分方法:

No. 方法名稱 類型 方法描述
01 protected Enum​(String name, int ordinal) 構造 傳入名字和序號
02 public final String name() 普通 獲得對象的名字
03 public final int ordinal() 普通 或的對象序號

範例:觀察Enum類的存在

enum Color{
	RED, GREEN, BLUE;
}

public class JavaDemo{

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

	}
}

在枚舉之中每一個對象的序號都是根據枚舉對象的定義順序來決定的。
面試題:請解釋enum和Enum的區別?
(1)enum:是從JDK 1.5之後提供的一個關鍵字,用於定義枚舉類;
(2)Enum:是一個抽象類,所以使用enum關鍵字定義的類就默認繼承了此類。

3 定義枚舉結構

枚舉本身就屬於多例設計模式,既然是多例設計模式,那麼在一個類之中可以定義的結構是非常多。例如:構造方法、普通方法、屬性等,那麼這些內容在枚舉類中依然可以直接定義,但是需要注意的是:枚舉類中定義的構造方法不能採用非私有化定義(public無法使用)。
範例:在枚舉類中定義其他結構

enum Color{
	RED("紅色"), GREEN("綠色"), BLUE("藍色"); //枚舉類型一定要放在首行
	private String title;  //定義屬性

	private Color(String title){
		this.title = title;
	}

	public String toString(){
		return this.title;
	}
}

public class JavaDemo{

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

	}
}

本程序在簡化程度上遠遠高於多例設計模式。除了這種基本的結構之外,在枚舉類中也可以實現接口的繼承。
範例:讓枚舉實現接口

interface IMessage{
	public abstract String getMessage();
}

enum Color implements IMessage{
	RED, GREEN, BLUE; //枚舉類型一定要放在首行

	public String getMessage(){
		return this.toString();
	}
}

public class JavaDemo{

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

	}
}

在枚舉類裏面可以直接定義抽象方法,並且要求每一個枚舉對象都要獨立覆寫此抽象方法。
範例:觀察枚舉中定義抽象方法

enum Color{
	RED{
		public String getInfo(){
			return this.toString();
		}
	}, GREEN{
		public String getInfo(){
			return this.toString();
		}
	}, BLUE{
		public String getInfo(){
			return this.toString();
		}
	}; //枚舉類型一定要放在首行

	public abstract String getInfo();
}

public class JavaDemo{

	public static void main(String[] args){
		Color co = Color.RED;
		for(Color temp : Color.values()){
			System.out.println( temp.getInfo());
		}

	}
}

枚舉正確用法:定義一個實例對象即可。

4 枚舉應用案例

現在定義一個Person類,裏面一定有性別,性別肯定不希望用戶隨意輸入,所以使用枚舉最合適。
範例:使用枚舉

enum Sex{
	MALE("男"), FEMALE("女");
	private String title;

	private Sex(String title){
		this.title = title;
	}

	public String toString(){
		return this.title;
	}
}

class Person{
	private String name;
	private int age;
	private Sex sex;

	public Person(){}

	public Person(String name, int age, Sex sex){
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

	public String toString(){
		return this.name + "  " + this.age + "  " + this.sex; 
	}
}

public class JavaDemo{

	public static void main(String[] args){
		Person per = new Person("lks", 23, Sex.MALE);
		System.out.println(per);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章