java基础之枚举类型

一、 初识java枚举类型
      枚举类型enum是指由一组固定的常量组成合法值的类型。例如一周七天、一年四季,java的枚举是在jdk1.5中引入的,在那之前多采用一种叫int枚举模式的方式实现。
Int 枚举模式

public class Season {
	
	public static final int SPRING = 1;
	
	public static final int SUMMER = 2;
	
	public static final int AUTUMN = 3;
	
	public static final int WINTER = 4;
	
}


Java枚举类型

public enum Season {
	SPRING,SUMMER,AUTUMN,WINTER
}



枚举类型相vs. int模式
1、 枚举类型提供编译时期类型安全。
2、 枚举类型对于提供了很多有用的方法,例如静态方法values()获取所有实例的数组,valueof(…)可以通过实例的名称获取对应的实例。

二、 枚举的特点

     枚举没有可访问的构造器(private或者包访问级别),不能创建实例,只能使用声明过得枚举常量。
三、 枚举的底层实现

     我们可以通过enum{}新建一个枚举类型,那么底层是如何支持这种类型的呢?实际上创建enum时,编译器会为你生成一个继承自java.lang.Enum的类,它实现了Comparable和Serializable接口,必然也继承自Object,因此,你可以将enum当做是一个普通的类来使用,使用继承自Object 、Comparable和Serializable的方法,添加自己的字段和方法,也可以实现其它接口,不过由于java的单根结构,不能在继承自其它的基类。
PS:向enum中添加方法,需要在最后一个enum实例后添加分号。

来看一下java.lang.Enum 的提供的方法,出了从父类接口继承过来的方法外,还有三个自己的方法。

name() 返回你声明的枚举实例的名字,比如上面的SPRING,对应的name就是”SPRING”.
ordinal() 返回枚举实例在声明中的序号,严格按照声明的顺序,不过操作枚举实例时,最好不要依赖于ordinal。说不定哪天你改了声明的顺序,却忘记改对应的操作,会造成不必要的麻烦。
valueOf 这是Enum的静态方法,通过枚举的Class类型和枚举实例的name返回枚举实例。


因为enum天生就具备整数值的次序,你可以通过ordinal()获取,switch可以使用enum。

枚举类型的values()方法

所有的枚举类型都是java.lang.Enum的子类,你可以这样赋值Enum<Season> autumn = Season.AUTUMN; 但是枚举类型拥有的values()方法Enum中却没有,那这个方法是哪来的呢。values()方法是由编译器插入到enum定义中的static方法。 values()的作用是获取枚举实例的集合,那如果是Enum<Season> autumn,这样声明的又如何获取枚举实例的集合呢。Class<?>提供了getEnumConstants()方法获取枚举实例的数组 ,当Class的类型不是enum时返回null。
四、 使用枚举

      考虑这样一个需求,从控制台接收一个字符串表示星期几,然后根据这个参数输出当天的工作性质(工作日or周末),或者是输出当天的心情。怎么做呢?


方法一 if-else 或者switch。这显然是最笨拙,可扩展性最差的一种实现方式了。


方法二 实现一个继承结构,表示各个星期,然后在父类中实现一个静态工厂方法,根据输入的参数返回星期N的实例。在学会使用枚举前,我基本上都会选择这么做。


方法三 使用枚举。

public enum Week {
	
	Sunday(Work.Weekend) {
		@Override
		public void mood() {
			System.out.println("为什么假期不能长点呢?!");
		}
	},Monday(Work.Weekday) {
		@Override
		public void mood() {
			System.out.println("好困呀,假期综合症");
		}
	},TuesdayMonday(Work.Weekday) {
		@Override
		public void mood() {
			System.out.println("奋斗ing");
		}
	},WednsdayMonday(Work.Weekday) {
		@Override
		public void mood() {
			System.out.println("奋斗ing");
		}
	},ThursdayMonday(Work.Weekday) {
		@Override
		public void mood() {
			System.out.println("为什么明天才是周五?");
		}
	},FridayMonday(Work.Weekday) {
		@Override
		public void mood() {
			System.out.println("好期待呀,就要放假了");
		}
	},Saturday(Work.Weekend) {
		@Override
		public void mood() {
			System.out.println("放假就是爽啊就是爽啊");
		}
	};
	//与常量相关的数据
	private Work work;
	
	private Week(Work work){
		this.work = work;
	}
	
	//在枚举中添加方法
	public boolean needWork(){
		return this.work.needWork;
	}
	
	//在枚举中添加abstract方法,也可以单独实现一个接口。
	public abstract void mood();
	
	enum Work{
		Weekday(true),Weekend(false);
		
		private Work(boolean needWork){
			this.needWork = needWork;
		}
		
		private boolean needWork;
	}
}

 

你可能感兴趣的:(java 枚举 int模式)