枚举

本文深入探讨了Java中枚举的使用,包括其概念、优势、如何模拟枚举功能,以及定义、调用和使用枚举的方法。通过具体代码示例,详细解释了枚举在简化代码、提高代码质量方面的应用。

一、什么是枚举

枚举就是对某个类型的变量的取值只能为若干个固定值中的一个。

枚举是一个特殊的类,里面的变量是一个个内部类,其实就是子父类的关系。当有且仅有一个变量的时候,可看做是单例,但是单例没有子父类关系。

二、为什么要有枚举

枚举使 编译器在编译时期就控制源程序中填写的非法值,否则编译器就会报错。普通变量的方式在开发阶段无法实现这一目标。

三、模拟枚举的功能

public class Weekday {
	public static final Weekday MON=new Weekday();
	public static final Weekday TUE=new Weekday();
	public static final Weekday WED=new Weekday();
	public static final Weekday THU=new Weekday();
	public static final Weekday FRI=new Weekday();
	public static final Weekday SAT=new Weekday();
	public static final Weekday SUN=new Weekday();
	private  Weekday(){}
	public  Weekday nextDay(){
		if(this==MON){
			return TUE;
		}else if(this==TUE){
			return WED;
		}else if(this==WED){
			return THU;
		}else if(this==THU){
			return FRI;
		}else if(this==FRI){
			return SAT;
		}else if(this==SAT){
			return SUN;
		}else if(this==SUN){
			return MON;
		}else{
			return null;
		}
	}
	public String toString(){
		if(this==MON){
			return "MON";
		}else if(this==TUE){
			return "TUE";
		}else if(this==WED){
			return "WED";
		}else if(this==THU){
			return "THU";
		}else if(this==FRI){
			return "FRI";
		}else if(this==SAT){
			return "SAT";
		}else if(this==SUN){
			return "SUN";
		}else{
			return null;
		}
	}	
}
用抽象方法可以将大量的if else语句转化为一个个独立的类。

public abstract class Weekday2 {
	public static final Weekday2 MON=new Weekday2(){
		public Weekday2 nextDay(){
			if(this==MON){
				return TUE;
			}else{
				return null;
			}
		}
	};
	public static final Weekday2 TUE=new Weekday2(){
		public Weekday2 nextDay(){
			if(this==TUE){
				return WED;
			}else{
				return null;
			}
		}
	};
	public static final Weekday2 WED=new Weekday2(){
		public Weekday2 nextDay(){
			if(this==WED){
				return THU;
			}else{
				return null;
			}
		}
	};
	public static final Weekday2 THU=new Weekday2(){
		public Weekday2 nextDay(){
			if(this==THU){
				return FRI;
			}else{
				return null;
			}
		}
	};
	public static final Weekday2 FRI=new Weekday2(){
		public Weekday2 nextDay(){
			if(this==FRI){
				return SAT;
			}else{
				return null;
			}
		}
	};
	public static final Weekday2 SAT=new Weekday2(){
		public Weekday2 nextDay(){
			if(this==SAT){
				return SUN;
			}else{
				return null;
			}
		}
	};
	public static final Weekday2 SUN=new Weekday2(){
		public Weekday2 nextDay(){
			if(this==SUN){
				return MON;
			}else{
				return null;
			}
		}
	};
	private  Weekday2(){}
	public abstract Weekday2 nextDay();
	
	public String toString(){
		if(this==MON){
			return "MON";
		}else if(this==TUE){
			return "TUE";
		}else if(this==WED){
			return "WED";
		}else if(this==THU){
			return "THU";
		}else if(this==FRI){
			return "FRI";
		}else if(this==SAT){
			return "SAT";
		}else if(this==SUN){
			return "SUN";
		}else{
			return null;
		}
	}
}
四、定义一个枚举

public enum Weekday3 {
	MON,TUE,WED,THU,FRI,SAT,SUN
}

枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。

带构造方法的枚举,构造方法必须是私有的

public enum Weekday3 {
	MON(1),TUE,WED,THU,FRI,SAT,SUN;
	private Weekday3(){}
	private Weekday3(int a){}
}

其中MON

(1)调用的是有参数的构造方法,而其他的都是调用无参的构造方法。

2、带有抽象方法的枚举,抽象方法被protected或者public修饰

public enum Weekday3 {
	MON(1){
		public Weekday3 nextDay(){
			if(this==MON){
				return TUE;
			}else{
				return null;
			}
		}
	},TUE(){
		public Weekday3 nextDay(){
			if(this==TUE){
				return WED;
			}else{
				return null;
			}
		}
	},WED{
		public Weekday3 nextDay(){
			if(this==WED){
				return THU;
			}else{
				return null;
			}
		}
	},THU{
		public Weekday3 nextDay(){
			if(this==THU){
				return FRI;
			}else{
				return null;
			}
		}
	},FRI{
		public Weekday3 nextDay(){
			if(this==FRI){
				return SAT;
			}else{
				return null;
			}
		}
	},SAT{
		public Weekday3 nextDay(){
			if(this==SAT){
				return SUN;
			}else{
				return null;
			}
		}
	},SUN{
		public Weekday3 nextDay(){
			if(this==SUN){
				return MON;
			}else{
				return null;
			}
		}
	};
	private Weekday3(){}
	private Weekday3(int a){}
	public abstract Weekday3 nextDay();
}
五、枚举中的方法

1、静态方法

类名.成员变量:直接调用

类名.valueOf(String 成员变量):将成员变量的字符串表现形式变成变量。

类名.values():返回一个包含成员变量的数组

2、非静态方法

name():返回变量的字符串表现形式,相当于toString();

ordinal():变量位于第几个位置,从0位置开始

values():同静态方法一致

valueOf(String 成员变量):同静态方法一致



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值