首页 > Java > 高新技术(三) 枚举
2014
05-26

高新技术(三) 枚举

①枚举的作用(为什么要有枚举)

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

如定义weekday时约定星期天用“0”表示,如果这时候用“7”则会报错,从而在编译阶段发现错误。

②用普通类模拟枚举的实现原理(WeekDay,同时该类实现了nextDay()、toString()方法,为方便起见,仅考虑Sunday、Monday),可参考java.awt.Color;

第一种实现:

public class WeekDay {
	public final static WeekDay SUN = new WeekDay();
	public final static WeekDay MON = new WeekDay();
	private WeekDay(){

	}
	public WeekDay nextDay(){
		return this == SUN ? WeekDay.MON : this == MON ? WeekDay.SUN : null;
	}

	public String toString(){
		return this == SUN ? "Sunday" : this == MON ? "Monday" : "出错了";
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		WeekDay mon = WeekDay.MON;
		System.out.println(mon.nextDay());
	}
}

第二种情况:将nextDay()改写为抽象方法,可以把大量if…else语句转换成每个子类具体去实现nextDay()方法。

public abstract class WeekDay {

	public final static WeekDay SUN = new WeekDay(){

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

	};
	public final static WeekDay MON = new WeekDay(){

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

	};
	private WeekDay(){

	}
	public abstract WeekDay nextDay();

	public String toString(){
		return this == SUN ? "Sunday" : this == MON ? "Monday" : "出错了";
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		WeekDay mon = WeekDay.SUN;
		System.out.println(mon.nextDay());
	}

}

③枚举类的创建与使用:

A. 定义一个WeekDay枚举类型(相当于定义了一个WeekDay类,该类的对象只能有指定的7个):

public enum WeekDay{

SUN,MON,TUE,WED,THU,FRI,SAT

}

B.使用:定义一个WeekDay类型变量:

WeekDay mon = WeekDay.MON;

WeekDay中常用的静态方法有valueOf( ), values( )

④实现带有构造方法的枚举

	public enum WeekDay{
		SUN(0),MON(),TUE(2),WED,THU,FRI,SAT;//此处分号不可少
		private WeekDay(){
			System.out.print("1\t");
		}
		private WeekDay(int day){
			System.out.print("2\t");
		}
	}
	public static void main(String[] args){
		WeekDay mon = WeekDay.MON;
		//输出:2	1	2	1	1	1	1
	}

⑤带有抽象方法的枚举

第一个例子:定义一个交通灯类,该类仅有RED、GREEN、YELLOW三个对象,并且每个对象都有nextLamp()方法。

	public enum TrafficLamp{
		RED{
			public TrafficLamp nextLamp() {
				return GREEN;
			}
		},GREEN{
			public TrafficLamp nextLamp() {
				return RED;
			}
		},YELLOW{
			public TrafficLamp nextLamp() {
				return RED;
			}
		};

		public abstract TrafficLamp nextLamp();
	}

第二个例子:在上面的基础上为每种灯加上自己的持续时间。

	public enum TrafficLamp{
		RED(40){
			public TrafficLamp nextLamp() {
				return GREEN;
			}
		},GREEN(30){
			public TrafficLamp nextLamp() {
				return RED;
			}
		},YELLOW(5){
			public TrafficLamp nextLamp() {
				return RED;
			}
		};
		private int time;
		private TrafficLamp(int time){
			this.time = time;
		}

		public abstract TrafficLamp nextLamp();
	}

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


留下一个回复

你的email不会被公开。