Java新特性——枚舉

  • 多例設計模式與枚舉
  • 使用枚舉進行基本操作

多例設計模式與枚舉

多例設計模式一定是構造方法私有化,而後在類的內部產生若干個實例化對象。
範例:定義顏色基色的多例設計模式

class Color{
	private static final Color RED = new Color("紅色");
	private static final Color GREEN = new Color("綠色");
	private static final Color BLUE = new Color("藍色");
	private String title;
	private Color(String title){
		this.title = title;
	}
	public String toString(){
		return this.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 class Hello{
	public static void main(String args[]) {
		Color c = Color.getInstance(1);
		System.out.println(c);
	}
}

麻煩,getInstance()方法沒有意義,內部到底有多少個實例化對象不清楚。因此JDK1.5之後有了一個新的關鍵字:enum,利用這個關鍵字就可以實現與多例相同的功能。
範例:枚舉

enum Color{
	RED,GREEN,BLUE;
}
public class Hello{
	public static void main(String args[]) {
		Color c = Color.GREEN;
		System.out.println(c);
	}
}

多例是枚舉的設計來源,在多例設計模式之中,所有的對象一定都是static final定義的,那麼就必須使用大寫字母表示。在枚舉裏面最大的支持還在於可以實現所有枚舉對象的遍歷操作。
範例:枚舉的遍歷操作

enum Color{
	RED,GREEN,BLUE;
}
public class Hello{
	public static void main(String args[]) {
		for(Color c:Color.values()){//values(),返回對象數組
			System.out.println(c);
		}
	}
}

枚舉本身就是爲了解決多例設計模式。

java.lang.Enum

嚴格來講使用enum定義的枚舉類不屬於新的結構,因爲本質上就相當於一個類繼承了java.lang.Enum類的形式。觀察Enum類的定義形式:

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

而在Enum類中定義的構造方法:

protected	Enum(String name, int ordinal) 

只能夠在本包或不同包的子類纔可以調用,其實就是構造方法的封裝。但是在這個構造方法中要接收兩個參數:對象名字name、對象序號ordinal。
在Enum類中有兩個方法可以取得名字和序號:

  • 取得名字:public final String name();
  • 取得序號:public final int ordinal()。
enum Color{
	RED,GREEN,BLUE;
}
public class Hello{
	public static void main(String args[]) {
		for(Color c:Color.values()){//values(),返回對象數組
			System.out.println(c.name()+"-->"+c.ordinal());
		}
	}
}

在這裏插入圖片描述
枚舉中的序號都是根據枚舉對象的定義順序得來的。
面試題:請解釋Enum與enum的區別?

  • enum是JDK1.5之後增加的一個關鍵字用於定義枚舉;
  • java.lang.Enum是一個抽象類,使用enum定義的枚舉本質就相當於一個類繼承了Enum。

枚舉中定義其他結構

枚舉在Java中屬於一種特殊的類,可是類中的組成是很豐富的:屬性、方法、構造方法、實現接口、繼承抽象類,這些功能枚舉都有。

enum Color{
	RED("紅色"),GREEN("綠色"),BLUE("藍色");//枚舉對象必須卸載首行
	private String title;//屬性
	private Color(String title){//構造方法必須使用非public
		this.title = title;
	}
	public String toString(){
		return this.title;
	}
}
public class Hello{
	public static void main(String args[]) {
		for(Color c:Color.values()){//values(),返回對象數組
			System.out.println(c.name()+"-->"+c.ordinal()+"-->"+c);
		}
	}
}

在這裏插入圖片描述
除了可以定義一些基本結構之外,枚舉也可以實現接口。對於接口的實現有兩種模式。
範例:統一實現接口

interface IMessage{
	public String getColor();
}
enum Color implements IMessage{
	RED("紅色"),GREEN("綠色"),BLUE("藍色");//枚舉對象必須卸載首行
	private String title;//屬性
	private Color(String title){//構造方法必須使用非public
		this.title = title;
	}
	public String toString(){
		return this.title;
	}
	@Override
	public String getColor() {
		return this.title;
	}
}
public class Hello{
	public static void main(String args[]) {
		IMessage msg = Color.RED;
		System.out.println(msg.getColor());
	}
}

範例:每個枚舉對象採用匿名內部類的方式實現接口

interface IMessage{
	public String getColor();
}
enum Color implements IMessage{
	RED("紅色"){
		public String getColor(){
			return "紅色";
		}
	},GREEN("綠色"){
		public String getColor(){
			return "綠色";
		}
	},BLUE("藍色"){
		public String getColor(){
			return "藍色";
		}
	};
	//枚舉對象必須卸載首行
	private String title;//屬性
	private Color(String title){//構造方法必須使用非public
		this.title = title;
	}
	public String toString(){
		return this.title;
	}
}
public class Hello{
	public static void main(String args[]) {
		IMessage msg = Color.RED;
		System.out.println(msg.getColor());
	}
}

最神奇的是枚舉裏面還可以定義抽象方法,同時每個枚舉對象要單獨實現抽象方法。
範例:枚舉中定義抽象方法

enum Color{
	RED("紅色"){
		public String getColor(){
			return "紅色";
		}
	},GREEN("綠色"){
		public String getColor(){
			return "綠色";
		}
	},BLUE("藍色"){
		public String getColor(){
			return "藍色";
		}
	};
	//枚舉對象必須卸載首行
	private String title;//屬性
	private Color(String title){//構造方法必須使用非public
		this.title = title;
	}
	public String toString(){
		return this.title;
	}
	public abstract String getColor();
}
public class Hello{
	public static void main(String args[]) {
		System.out.println(Color.RED.getColor());
	}
}

以上純屬瞭解概念,別用。

枚舉實際應用

枚舉就是表示一個類的對象選用範圍,那麼下面定義一個表示人的類,裏面有性別。
範例:實現枚舉的應用

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(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 Hello{
	public static void main(String args[]) {
		System.out.println(new Person("張三",10,Sex.MALE));
	}
}

以上代碼不用枚舉也可以實現,不推薦用枚舉。

總結

在這裏插入圖片描述

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