天天看點

Java中的枚舉類型Enum1. 定義枚舉類型2. 枚舉類型的常用方法3. 比較枚舉常量4. 建立枚舉常量5. 定義進階的枚舉類型

    Java中所有的枚舉類型都是java.lang.Enum的子類。

1. 定義枚舉類型

    簡單定義一個枚舉類型,如下:

public enum Week {
	MONDAY, 
	TUESDAY, 
	WEDNESDAY, 
	THURSDAY, 
	FRIDAY, 
	SATURDAY, 
	SUNDAY;
}
           

2. 枚舉類型的常用方法

    可以使用枚舉類型的values()靜态方法傳回枚舉類型中的所有枚舉值,使用枚舉常量的name()方法傳回枚舉常量的名稱,使用枚舉常量的ordinal()方法傳回枚舉常量的序數(常量在枚舉聲明中的位置,從0開始)。示例代碼如下:

public static void main(String[] args) {
	//擷取枚舉類型中的全部枚舉值
	Week[] days = Week.values();
	for(Week day : days) {
		//傳回枚舉常量的名稱
		String name = day.name();
		//傳回枚舉常量的序數(常量在枚舉聲明中的位置,從0開始)
		int ordinal = day.ordinal();
		String toString = day.toString();
		Class declaringClass = day.getDeclaringClass();
		Class superClass = declaringClass.getSuperclass();
		System.out.println(
				"Name: " + name
				+ "\n" 
				+ "Ordinal: " + ordinal
				+ "\n" 
				+ "ToString: " + toString
				+ "\n" 
				+ "DeclaringClass: " + declaringClass
				+ "\n" 
				+ "SuperClass: " + superClass
				+ "\n" 
			);
	}
}
           

輸出結果如下:

Name: MONDAY
Ordinal: 0
ToString: MONDAY
DeclaringClass: class myEnum.Week
SuperClass: class java.lang.Enum

Name: TUESDAY
Ordinal: 1
ToString: TUESDAY
DeclaringClass: class myEnum.Week
SuperClass: class java.lang.Enum

Name: WEDNESDAY
Ordinal: 2
ToString: WEDNESDAY
DeclaringClass: class myEnum.Week
SuperClass: class java.lang.Enum

Name: THURSDAY
Ordinal: 3
ToString: THURSDAY
DeclaringClass: class myEnum.Week
SuperClass: class java.lang.Enum

Name: FRIDAY
Ordinal: 4
ToString: FRIDAY
DeclaringClass: class myEnum.Week
SuperClass: class java.lang.Enum

Name: SATURDAY
Ordinal: 5
ToString: SATURDAY
DeclaringClass: class myEnum.Week
SuperClass: class java.lang.Enum

Name: SUNDAY
Ordinal: 6
ToString: SUNDAY
DeclaringClass: class myEnum.Week
SuperClass: class java.lang.Enum
           

3. 比較枚舉常量

    判斷兩個枚舉類型常量的值是否相等,可以直接使用“==”,而不用equals()方法。比較兩個枚舉類型常量的值的大小,可以使用compareTo()方法。

public static void main(String[] args) {
	Week mon = Week.MONDAY;
	Week tues = Week.TUESDAY;
	Week wed = Week.WEDNESDAY;
	//比較枚舉常量,實際上是比較它們序數的大小
	System.out.println(mon.compareTo(tues));
	System.out.println(tues.compareTo(wed));
	System.out.println(wed.compareTo(mon));
}
           

輸出結果如下:

-1
-1
2
           

    實際上,比較兩個枚舉常量的大小,就是比較它們序數ordinal的大小。在JDK1.6的Enum源碼中compareTo()方法如下:

public final int compareTo(E o) {
	Enum other = (Enum)o;
	Enum self = this;
	if (self.getClass() != other.getClass() && // optimization
            self.getDeclaringClass() != other.getDeclaringClass())
	    throw new ClassCastException();
	return self.ordinal - other.ordinal;
}
           

4. 建立枚舉常量

    建立枚舉常量主要有三種方法:直接利用枚舉類型建立枚舉常量、使用Enum的valueOf()靜态方法建立枚舉常量、使用枚舉類型的valueOf()靜态方法建立枚舉常量。

//直接建立枚舉常量
Week mon = Week.MONDAY;
//使用Enum的valueOf()靜态方法建立枚舉常量
Week tues = Enum.valueOf(Week.class, "TUESDAY");
//使用枚舉類型的valueOf()靜态方法建立枚舉常量
Week wed = Week.valueOf("WEDNESDAY");
           

5. 定義進階的枚舉類型

    根據需要,可以在枚舉類型中添加構造器、方法和字段,還可以讓枚舉類型繼承接口。

    定義接口IWeek,如下:

public interface IWeek {
	public void println();
}
           

    定義進階的枚舉類型AdvancedWeek,擁有自己的構造器、方法和字段,并實作IWeek接口。

public enum AdvancedWeek 
	implements IWeek{
	
	MONDAY("星期一", "Mon."), 
	TUESDAY("星期二", "Tues."), 
	WEDNESDAY("星期三", "Wed."), 
	THURSDAY("星期四", "Thurs."), 
	FRIDAY("星期五", "Fri."), 
	SATURDAY("星期六", "Sat."), 
	SUNDAY("星期日", "Sun.");
	
	private String nameCn;
	private String abbreviation;
	
	//構造方法隻能為private
	private AdvancedWeek() {}

	private AdvancedWeek(String nameCn, String abbreviation) {
		this.setNameCn(nameCn);
		this.setAbbreviation(abbreviation);
	}

	public String getNameCn() {
		return nameCn;
	}

	public void setNameCn(String nameCn) {
		this.nameCn = nameCn;
	}

	public String getAbbreviation() {
		return abbreviation;
	}

	public void setAbbreviation(String abbreviation) {
		this.abbreviation = abbreviation;
	}
	
	public void println() {
		System.out.println(this.ordinal() + " - " + this.name() + " - " + this.getAbbreviation() + " - " + this.getNameCn());
	}
}
           

需要注意的是,枚舉類型的構造方法隻能為private。

    測試AdvancedWeek,如下:

public static void main(String[] args) {
	AdvancedWeek[] days = AdvancedWeek.values();
	for(AdvancedWeek day : days) {
		day.println();
	}
}
           

輸出結果為:

0 - MONDAY - Mon. - 星期一
1 - TUESDAY - Tues. - 星期二
2 - WEDNESDAY - Wed. - 星期三
3 - THURSDAY - Thurs. - 星期四
4 - FRIDAY - Fri. - 星期五
5 - SATURDAY - Sat. - 星期六
6 - SUNDAY - Sun. - 星期日
           

本文示例源代碼下載下傳位址:http://download.csdn.net/detail/snarlfuture/6905771