您的位置:首页 > 编程语言 > Java开发

Java高新技术之枚举

2013-05-10 13:01 225 查看

枚举的概念

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

问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。

用普通类实现枚举功能

要求:
私有的构造方法

每个元素分别用一个公有的静态成员变量表示,每一个元素都是类类型的元素
public class Weekdays {
	private Weekdays() {
	}
	public final static Weekdays SUN=new Weekdays();
	public final static Weekdays MON=new Weekdays();
	
	public Weekdays nextDay() {
		if(this==MON){
			return SUN;
		}else {
			return MON;
		}
	}
	
	public  String toString() {
		return this==SUN?"SUM":"MON";
	}
	
	public static void main(String[] args) {
		Weekdays weekday=Weekdays.MON;
		System.out.println(weekday.nextDay());
	}
}
这里只列出了两个元素,当元素比较多的时候需要大量的if.else语句,可以定义若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
abstract class  WeekDay {
	private WeekDay() {
	};
	public final static WeekDay SUN = new WeekDay(){
		@Override
		public WeekDay nextDay() {
			return SUN;
		}
	};
	public final static WeekDay MON = new WeekDay(){

		@Override
		public WeekDay nextDay() {
			return MON;
		}
	};
	public abstract WeekDay nextDay();
	public String toString() {
		return this == SUN ? "SUN" : "MON";
	}
}

枚举的基本应用

public enum Days{
	SUN,MON,TUS,WED,THI,FRI,SAT;
}
public class EnumDemo {
	public static void main(String[] args) {
		Days days=Days.FRI;
		System.out.println(days);
		System.out.println(days.name());
		System.out.println(days.getClass());
		System.out.println(days.ordinal());
		System.out.println(Days.valueOf("SUN"));
		System.out.println(Days.valueOf(Days.class, "SUN"));
		for(Days day:Days.values()){
			System.out.println(day);
		}
}


带有构造方法的枚举

构造方法可以有参数,可以没有参数
public enum Days{
		SUN(0),MON,TUS,WED,THI,FRI,SAT;
		private Days(){
			System.out.println("first");
		}
		private Days(int day){
			System.out.println("second");
		}
	}
我们发现只要使用了枚举中的元素如Days days=Days.FRI;枚举类中的所有元素都会被初始化,等效于静态的成员变量

带有抽象方法的枚举

public enum Days{
		SUN(0) {
			public Days nextDay() {
				return MON;
			}
		},MON {
			public Days nextDay() {
				return TUS;
			}
		},TUS {
			public Days nextDay() {
				return WED;
			}
		},WED {
			public Days nextDay() {
				return THI;
			}
		},THI {
			public Days nextDay() {
				return FRI;
			}
		},FRI {
			public Days nextDay() {
				return SAT;
			}
		},SAT {
			public Days nextDay() {
				return SUN;
			}
		};
		private Days(){
			System.out.println("first");
		}
		private Days(int day){
			System.out.println("second");
		}
		public abstract Days nextDay();
	}
此时枚举中的元素,都需要复写父类的抽象方法

总结:枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。

枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
补充:1、枚举只有一个成员时,就可以作为一种单例的实现方式。2、switch语句支持枚举类型的数据

问题:枚举能不能继承其他类?

答:不能,因为所有的枚举都继承自java.lang.Enum类。由于Java不支持多继承,所以枚举对象不能再继承其他类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: