这篇文章主要介绍一下Java中的枚举类型。

从字面意思看枚举类型即是可数的有限的对象集合。所以枚举类型的适用范围也就很显而易见。比如用枚举类型标识'季节',或者'月份'等等。

在实现枚举类型之前,先大致介绍归纳一下枚举类型所拥有的一些特性。1:枚举类型中的对象一般是固定不变的;2:不能对枚举类型中的对象设值;3.枚举类型需要提供遍历方法。我们不妨拿'季节'作为例子先来自己实现一个满足上述条件的枚举类型。代码如下:

 

class Season {

	//The enumerable objects' fields will not change once initialized in constructor.
	//so use final as modifier
	private final String name;
	private final String desc;
	
	private Season(String name, String desc) {
		this.name = name;
		this.desc = desc;
	}

	//Only provide get method for enumerable objects' fields,since they are never changed.
	public String getName() {
		return name;
	}

	public String getDesc() {
		return desc;
	}

	//The enumerable object is immutable once initialized.
	//so use final modifier
	public static final Season SPRING = new Season("Spring", "warm");
	public static final Season SUMMER = new Season("Summer", "hot");
	public static final Season AUTUMN = new Season("Autumn", "cool");
	public static final Season WINTER = new Season("Winter", "cold");

	//Provide enumeration method for the enumerable object
	public static List<Season> values() {
		List<Season> seasonList = new ArrayList<Season>();
		seasonList.add(Season.SPRING);
		seasonList.add(Season.SUMMER);
		seasonList.add(Season.AUTUMN);
		seasonList.add(Season.WINTER);
		return seasonList;
	}

}

 

 

 

上述代码基本按照自己的理解实现了枚举特性,但是相比jdk5提供的枚举却显的笨重。于是乎先给出对应的jdk5以上的Season枚举类,并会在之后对其中的代码做讲解。代码如下:

 

enum EnumSeason {

	//Simplified object declaration and initialization.
	SPRING("Spring","warm"),
	SUMMER("Summer","hot"),
	AUTUMN("Autumn","cool"),
	WINTER("Winter","cold");
	
	private final String name;
	private final String desc;
	
	private EnumSeason(String name, String desc) {
		this.name = name;
		this.desc = desc;
	}
	
	public String getName() {
		return name;
	}

	public String getDesc() {
		return desc;
	}
	
}

 

你也许会发现这段代码在枚举对象构造的时候十分的方便,其实这种方式简化了原先public static final这些修饰符声明,但是还是表示同样的含义,此外你会发现这段代码中没有为枚举类提供枚举方法。这并不是代码的疏漏,而是jdk对以enum声明的枚举类已经默认的提供了这个方法,我们可以用以下的代码来对枚举类中的对象进行一个遍历。代码如下:

 

public class Testenum {
	public static void main(String args[]) {
		EnumSeason[] seasons = EnumSeason.values();
		for(EnumSeason e: seasons){
			System.out.println(e.getName() +"-" +e.getDesc());
		}		
	}
}

 

result:

 

 

Spring-warm

Summer-hot

Autumn-cool

Winter-cold



结果如你所见的呈现在眼前。至此,枚举的基本特性已经讲完。

 

最后需要强调两个关于枚举的重要的用法。其一,jdk5开始对switch控制语句进行的强化,支持switch的内容从原先的int,byte,char和short又增加了一个enum对象。对于enum的switch,具体的case只需要写上enum类型的具体对象即可。代码如下:

 

public class Testenum {
	public static void main(String args[]) {
		EnumSeason season = EnumSeason.SPRING;

		switch (season) {
		case SPRING:
			System.out.println("this is spring");
			break;
		case SUMMER:
			System.out.println("this is summer");
			break;
		case AUTUMN:
			System.out.println("this is autumn");
			break;
		case WINTER:
			System.out.println("this is winter");
			break;
		default:
			break;
		}

	}
}

其二,如何为enum类实现接口方法,它的实现可以完全和class相同,但是我们注意到当我对这个接口的实现因为枚举类中的不同对象而不同。那又当如何呢?假定我们有这样一个接口。代码如下:

 

public interface Quarter {
	void quarterDef();
}

 

那我们最普通的做法可以让enum实现Quarter接口,然后实现方法。方法中根据name属性来区分当前是那个枚举对象,然后通过if/else语句进行逻辑处理。当然我们更为推荐的做法是匿名内部类实现这样的接口方法。代码如下:

 

enum EnumSeason implements Quarter{

	// Simplified object declaration and initialization.
	SPRING("Spring", "warm"){
		@Override
		public void quarterDef() {
			System.out.println("this is the first quarter");
		}
	},
	SUMMER("Summer", "hot"){
		@Override
		public void quarterDef() {
			System.out.println("this is the second quarter");
		}
	},
	AUTUMN("Autumn", "cool"){
		@Override
		public void quarterDef() {
			System.out.println("this is the third quarter");			
		}
	},
	WINTER("Winter", "cold"){
		@Override
		public void quarterDef() {
			System.out.println("this is the forth quarter");
		}
	};

	private final String name;
	private final String desc;

	private EnumSeason(String name, String desc) {
		this.name = name;
		this.desc = desc;
	}

	public String getName() {
		return name;
	}

	public String getDesc() {
		return desc;
	}
}

 这样的代码是不是更优雅更面向对象呢。

 

至此Java的枚举类型已经介绍完了。

 

在自己做了个笔记的同时也希望上述内容能对大家有所帮助。