Java高新技术-枚举


说明:当一个类的对象个数固定,且不需要再创建这个类新的对象时,可以考虑用枚举。


一,枚举原理

枚举类型特有:

1.私有构造方法;

2.每个元素分别用一个公有的静态成员变量表示;

3.可以有若干个公有方法或抽象方法,抽象方法可以使每个元素(本类对象)通过覆盖具有自己独特的内容;

注:枚举类型的元素就是本类对象,但是限制了用户自己创新的对象,只能使用该类提供的对象->元素。

枚举是为了让这个类型的变量的取值只能为若干固定值中的一个。

枚举代码原理举例一:

class Weekday{
				//私有构造方法可以防止外部创建本类新对象;
				//保证创建个数;
				private Weekday(){};
				//通过公有静态的本类对象的成员,为外部提供了获取该类对象的途径;
				//而且本类对象个数是可控,确定。
				public static Weekday MONDAY=new Weekday();
				public static Weekday TUESDAY=new Weekday();
				public static Weekday WEDNESDAY=new Weekday();
				public static Weekday THURSDAY=new Weekday();
				public static Weekday FRIDAY=new Weekday();
				public static Weekday SATURDAY=new Weekday();
				public static Weekday SUNDAY=new Weekday();
				
				public Weekday nextDay(){
					/*本方法为非静态方法,当外部通过如
					 * Weekday today=Weeday.FRIDAY;
					 * 获取到本类对象后,就可以通过对象调用非静态方法
					 */
					if(this==MONDAY)
						return TUESDAY;
					if(this==TUESDAY)
						return WEDNESDAY;
					if(this==WEDNESDAY)
						return THURSDAY;
					if(this==THURSDAY)
						return FRIDAY;
					if(this==FRIDAY)
						return SATURDAY;
					//if(this==SATURDAY)
					return SUNDAY;
				}
				public String toString(){
					if(this==MONDAY)
						return "MONDAY";
					if(this==TUESDAY)
						return "TUESDAY";
					if(this==WEDNESDAY)
						return "WEDNESDAY";
					if(this==THURSDAY)
						return "THURSDAY";
					if(this==FRIDAY)
						return "FRIDAY";
					if(this==SATURDAY)
						return "SATURDAY";
					return "SUNDAY";
				}	
			}


枚举代码原理举例二:

因为对于Weekday类对象,每一个nextDay方法对应的结果都是不同而且固定的,这里可以采用将nextDay变为抽象方法,在创建元素时通过覆盖nextDay方法,将该方法返回值设为需要的指定结果。这样避免你了上面例子中多个if...else...的语句重复选择。

abstract class Weekday{
				//私有构造方法可以防止外部创建本类新对象;
				//保证创建个数;
				private Weekday(){};
				//通过公有静态的本类对象的成员,为外部提供了获取该类对象的途径;
				//而且本类对象个数是可控,确定。
				public static Weekday MONDAY=new Weekday(){
					public Weekday nextDay(){		
							return TUESDAY;
					}
				};
				public static Weekday TUESDAY=new Weekday(){
					public Weekday nextDay(){		
						return WEDNESDAY;
					}
				};
				public static Weekday WEDNESDAY=new Weekday(){
					public Weekday nextDay(){		
						return THURSDAY;
					}
				};
				public static Weekday THURSDAY=new Weekday(){
					public Weekday nextDay(){		
						return FRIDAY;
					}
				};
				public static Weekday FRIDAY=new Weekday(){
					public Weekday nextDay(){		
						return SATURDAY;
					}
				};
				public static Weekday SATURDAY=new Weekday(){
					public Weekday nextDay(){		
						return SUNDAY;
					}
				};
				public static Weekday SUNDAY=new Weekday(){
					public Weekday nextDay(){		
						return MONDAY;
					}
				};
				
				
				public String toString(){
					if(this==MONDAY)
						return "MONDAY";
					if(this==TUESDAY)
						return "TUESDAY";
					if(this==WEDNESDAY)
						return "WEDNESDAY";
					if(this==THURSDAY)
						return "THURSDAY";
					if(this==FRIDAY)
						return "FRIDAY";
					if(this==SATURDAY)
						return "SATURDAY";
					return "SUNDAY";
				}	
			}


二,枚举

下面介绍枚举的应用。

示例1:枚举常见方法

在一个类内创建一个枚举,此时枚举类内部类,可以用成员修饰词来修饰。

public class Test {	
	public static void main(String[] args) throws Exception{
		//获取枚举元素方法。
		Weekday today=Weekday.MON;
		//获取元素在枚举中的位置
		System.out.println(today.ordinal());
		//获取元素的枚举类名
		System.out.println(today.getClass());
		//通过名称获取枚举的指定元素
		System.out.println(Weekday.valueOf("FRI"));
		//获取枚举中所有元素
		Weekday[] days=Weekday.values();
		
	}
	public enum Weekday{
		//元素名称必须写在枚举类的第一行
		SUN(),MON(1),TUE,WED,THU,FRI,SAT;
		//构造方法不写,如果要构造方法,则必须修饰为私有private;
		private Weekday(){
			System.out.println("无参构造函数");
		}
		/*当哟多个构造方法时,可以在元素后面加();
		 *并在()内根据构造方法的形参格式传值;
		 *就会调用相应的构造方法
		 *如元素后面不加(),则默认调用无参构造函数
		 */
		private Weekday(int a){
			System.out.println("有参构造函数"+a);
		}
		public String toString(){
			if(this==MON)
				return "MONDAY";
			if(this==TUE)
				return "TUESDAY";
			if(this==WED)
				return "WEDNESDAY";
			if(this==THU)
				return "THURSDAY";
			if(this==FRI)
				return "FRIDAY";
			if(this==SAT)
				return "SATURDAY";
			return "SUNDAY";
		}
	}
}

示例2:包含抽象方法的枚举

在类内创建枚举时(即内部类枚举)如果枚举里有抽象方法,枚举类名前不需要加abstract关键词,枚举中每个元素要重写该抽象方法。

 enum TrafficLamp{
	RED(30){
		//元素需要重写枚举方法
		public  TrafficLamp nextLamp(){
			return GREEN;
		}
	},
	GREEN(45){
		public  TrafficLamp nextLamp(){
			return YELLOW;
		}			
	},
	YELLOW(5){
		public  TrafficLamp nextLamp(){
			return RED;
		}			
	};
	//枚举中的抽象方法
	public abstract TrafficLamp nextLamp();
	private int time;
	//枚举中的有参函数
	private TrafficLamp(int time){this.time = time;}
}



示例3:枚举只有一个成员是,就可以作为一种单例的实现方式

 enum Student{
	LiSi;
	//私有构造函数
	private Student(){};
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值