黑马程序员_枚举总结

---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

一、枚举的作用

      1,问题的由来

        要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。因此需要一种机制对这种类型的变量进行限制,使变量的取值只能为若干个固定值中的一个,这样就避免了错误的发生,而枚举的出现解决了这方面的问题。

       2,枚举的理解       

        枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

        因而可以总结为枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。

二、用普通的类模拟枚举类

       1,定义一个枚举类MyWeekday

public class MyWeekDay {
	private MyWeekDay(){}
	
	public static final MyWeekDay SUN = new MyWeekDay();
	public static final MyWeekDay MON = new MyWeekDay();
	public static final MyWeekDay TUE = new MyWeekDay();
	public static final MyWeekDay WED = new MyWeekDay();
	public static final MyWeekDay THI = new MyWeekDay();
	public static final MyWeekDay FRI = new MyWeekDay();
	public static final MyWeekDay SAT = new MyWeekDay();
	
	public  MyWeekDay nextDay(){
		if(this == SUN)
			return MON;
		else if(this == MON)
			return TUE;
		else if(this == MON)
			return TUE;
		else if(this == TUE)
			return WED;
		else if(this == WED)
			return THI;
		else if(this == THI)
			return FRI;
		else if(this == FRI)
			return SAT;
		else 
			return SUN;
		
	}
	public String toString(){
		if(this == SUN)
			return "SUN";
		else if(this == MON)
			return "MON";
		else if(this == TUE)
			return "TUE";
		else if(this == WED)
			return "WED";
		else if(this == THI)
			return "THI";
		else if(this == FRI)
			return "FRI";
		else
			return "SAT";
		
	}
}

       2,定义一个类EumerationTest,当我们在使用MyWeekDay时只能使用其预先定义的数据,即采用类名调用的方式。下面程序使用MyWeekDay时,将星期定义为FRI,当调用nextDay方法时返回下一天,打印SAT

public class EumerationTest {
		public static void main(String[] args) {
		MyWeekDay weekDay = MyWeekDay.FRI;
		System.out.println(weekDay.nextDay());
	}

}

      3,总结利用普通类模拟枚举类的步骤

           3.1,将类的构造函数私有,外部使用者不能创建对象

           3.2,创建若干本类对象,供为外部使用者使用,对象声明为public,static,final。

           3.3,可以根据需求为枚举类定义若干方法。

     4,MyWeekDay中nextDay方法存在大量if-else语句,可通过内名内部类的形式将其转移到每个子类实例中,那么可将该方法声明为抽象,让子类实现,将MyWeekDay声明为抽象类。

public abstract class MyWeekDay {
	private MyWeekDay(){}
	
	public static final MyWeekDay SUN = new MyWeekDay(){

		@Override
		public MyWeekDay nextDay() {
			// TODO Auto-generated method stub
			return MON;
		}
		
	};
	public static final MyWeekDay MON = new MyWeekDay(){

		@Override
		public MyWeekDay nextDay() {
			// TODO Auto-generated method stub
			return TUE;
		}
		
	};
	public static final MyWeekDay TUE = new MyWeekDay(){

		@Override
		public MyWeekDay nextDay() {
			// TODO Auto-generated method stub
			return WED;
		}
		
	};
	public static final MyWeekDay WED = new MyWeekDay(){

		@Override
		public MyWeekDay nextDay() {
			// TODO Auto-generated method stub
			return THI;
		}
		
	};
	public static final MyWeekDay THI = new MyWeekDay(){

		@Override
		public MyWeekDay nextDay() {
			// TODO Auto-generated method stub
			return FRI;
		}
		
	};
	public static final MyWeekDay FRI = new MyWeekDay(){

		@Override
		public MyWeekDay nextDay() {
			// TODO Auto-generated method stub
			return SAT;
		}
		
	};
	public static final MyWeekDay SAT = new MyWeekDay(){

		@Override
		public MyWeekDay nextDay() {
			// TODO Auto-generated method stub
			return SUN;
		}
		
	};
	
	public abstract MyWeekDay nextDay();
	public String toString(){
		if(this == SUN)
			return "SUN";
		else if(this == MON)
			return "MON";
		else if(this == TUE)
			return "TUE";
		else if(this == WED)
			return "WED";
		else if(this == THI)
				return "THI";
		else if(this == FRI)
			return "FRI";
		else
			return "SAT";
		
	}
}

三、利用enum关键字定义枚举

       1,定义枚举类注意事项

             1.1,定义的枚举类元素应用分号分隔开来,且定义的元素应在枚举类最前面,即定义的元素前面不能有内容

             1.2,当枚举类中定义其它内容时,最后的元素结尾处应以分号结束

       2,枚举类示例WeekDay

public enum WeekDay {
	SUN,MON,TUE,WED,THI,FRI,SAT;
}
WeekDay wDay = WeekDay.FRI;
System.out.println(wDay.ordinal());//打印5,

四、实现带有构造函数的枚举类

       1,构造函数放在所有成员之后

       2,构造函数声明为private

public enum WeekDay {
	SUN(1),MON,TUE,WED,THI,FRI,SAT;
	private WeekDay(){
		System.out.println("first");
	}
	private WeekDay(int i){
		System.out.println("second");
	}
}

       Weekday提供了两个构造函数,和普通的类的构造函数一样,会为相应的对象进行初始化,当使用Weekday时,会打SUN对象会调用WeekDay(int i)这个构造函数打印second,而其它的对象会调用WeekDay()打印first。

五、实现带有抽象方法的枚举

       实现带有抽象方法的枚举可以从以下几方面着手

       1,定义成员

       2,定义抽象方法

       3,为每个成员添加{},并在其中复写抽象方法

       4,根据需要定义其它内容,如枚举类的成员变量,方法等

 

 

public enum WeekDay {
	SUN{

		@Override
		public WeekDay nextDay() {
			// TODO Auto-generated method stub
			return MON;
		}
		
	},
	MON{

		@Override
		public WeekDay nextDay() {
			// TODO Auto-generated method stub
			return TUE;
		}
		
	},
	TUE{

		@Override
		public WeekDay nextDay() {
			// TODO Auto-generated method stub
			return WED;
		}
		
	},
	WED{

		@Override
		public WeekDay nextDay() {
			// TODO Auto-generated method stub
			return THI;
		}
		
	},
	THI{

		@Override
		public WeekDay nextDay() {
			// TODO Auto-generated method stub
			return FRI;
		}
		
	},
	FRI{

		@Override
		public WeekDay nextDay() {
			// TODO Auto-generated method stub
			return SAT;
		}
		
	},
	SAT{

		@Override
		public WeekDay nextDay() {
			// TODO Auto-generated method stub
			return SUN;
		}
		
	};
	private WeekDay(){
		System.out.println("first");
	}
	public abstract WeekDay nextDay();
}

六,枚举与单例设计模式

       当枚举只有一个成员时,就可以作为一种单例的实现方式。

       1,一种单例设计方式

class Single
{
	private static final Single s = new Single();
	private Single(){}
	public static Single getInstance()
	{
		return s;
	}
}

       2,枚举实现单例

public enum Single{
	SINGLE;
}




 

 ---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.youkuaiyun.com" target="blank">http://edu.youkuaiyun.com</a>


 




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值