zoukankan      html  css  js  c++  java
  • Java5新特性之枚举

     1.  概念

      首先,枚举并非一种新技术,而是一种基础数据类型.它隶属于两种基础类型中的值类型,例如以下:


      


     2.  为什么要有枚举

      枚举在真正的开发中是非经常常使用的,它的作用非常easy也非常纯粹:它定义了一种规范,就是要让某个类型的变量的取值仅仅能为若干个固定值中的一个,也就是要符合它定义的规范.它能够让编译器在编译时就能够识别程序中填写的非法值,一定程度上防止了执行时的非法类型值错误.

      比如:要定义星期几的变量,假设用普通变量1-7   分别表示星期一到星期日,但有人可能写成int weekday=0.这样的错误仅仅能到执行时才干发现,编译是没问题的。但假设用枚举取代普通变量,就可将错误在编译时识别。

      枚举本身当然是一个类,它的定义与使用与普通类非常类似。而每一个枚举变量都相当于类的一个对象。以下将分别介绍枚举的基本使用、带有构造方法的枚举、带有抽象方法的枚举。例如以下:


    3.  基本使用

         实例:

    public class EnumTest2 {
    	public static void main(String[] args) {
    		WeekDay weekDay2 = WeekDay.FRI;
    		//使用1:toString()方法
    		System.out.println(weekDay2);//输出:FRI
    		//使用2:name()方法
    		System.out.println(weekDay2.name());//输出:FRI
    		//使用3:ordinal()方法
    		System.out.println(weekDay2.ordinal());	//输出:5
    		//使用4:枚举变量的反射
    		System.out.println(WeekDay.valueOf("SUN").toString());//输出:SUN
    		//使用5:获取枚举的长度
    		System.out.println(WeekDay.values().length);//输出:7
    	}
    	/**
    	 * 定义枚举类--这里作为測试类的一个子类
    	 */
    	public enum WeekDay{
    		SUN,MON,TUE,WED,THI,FRI,SAT;
    	}		
    }


    4.  带有构造方法的枚举

      首先有两点要求:

      Ø  要求全部的东西都要在枚举变量之后写

      Ø  构造方法必须是私有的

      使用:

      Ø  当使用某一个枚举变量时,就会将全部的枚举变量都实例化并缓存。以后再次用到时不会再次实例化。

      Ø  与普通类一样。枚举变量採用哪一个构造方法,也是依据參数的类型与个数而定。

      实例:

    public class EnumTest {
    	public static void main(String[] args) {
    		WeekDay weekDay = WeekDay.MON;	
    		System.out.println("-------------");
    		WeekDay weekDay2 = WeekDay.TUE;	
    		/*
    		 * 输出结果例如以下:
    		 	构造方法3
    			构造方法2
    			构造方法1
    			构造方法1
    			构造方法1
    			构造方法1
    			构造方法1
    			-------------(结束)
    		 * 上面调用MON时。全部的枚举变量的构造方法都被调用;再次调用TUE时没有再调用
    		 * 表明,当使用某一个枚举变量时。就会将全部的枚举变量都实例化并缓存;
    		 * 以后再次用到时不会再次实例化
    		 */
    	}
    	/**
    	 * 定义枚举类--这里作为測试类的一个子类
    	 */
    	public enum WeekDay{
    		//与普通类一样。枚举变量採用哪一个构造方法,也是依据參数的类型与个数而定
    		//例如以下SUN将採用构造方法3;MON採用构造方法2;其余的都採用构造方法1
    		SUN(1,2),MON(1),TUE(),WED,THI,FRI,SAT;
    		
    		//构造方法1:
    		private WeekDay(){System.out.println("构造方法1");}
    		//构造方法2
    		private WeekDay(int day){System.out.println("构造方法2");}
    		//构造方法3
    		private WeekDay(int day,int day2){System.out.println("构造方法3");}
    	}

    5.  带有抽象方法的枚举

      枚举类中的逻辑方法。肯定会涉及到全部的枚举变量,要进行逻辑推断就必需要使用大量的if…else语句。而使用抽象方法就能够将if…else语句转移成一个个独立的类。

      如。以下的交通灯枚举类中,若要计算下一个灯的颜色,普通的写法肯定要推断,假设当前“红灯”那么下一个灯为“绿灯”;假设当前为“绿灯”那么下一个灯为“黄灯”……。而假设使用抽象方法则可将一系列推断转移为一个个独立的类。实例:

    	/**
    	 * 定义枚举类
    	 */
    	public enum TrafficLamp{
    		//"{}"表示一个匿名子类。所以就能够重写枚举的抽象方法。这里将if..else转化为了3个匿名子类
    		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;}//构造方法
    	}

    6.  普通类模拟枚举类

      以下简单用普通类来模拟一下枚举类

      要素:

      Ø  私有的构造方法

      Ø  用一个个公有的静态成员变量模拟枚举变量

      Ø  能够有若干公有方法或

      实例:

    package TestPage;
    
    public abstract class WeekDay {
    	//	私有的构造方法
    	private WeekDay(){}
    	//	公有的静态成员变量SUN、MON模拟枚举变量,"{}"表示一个匿名子类
    	public final static WeekDay SUN = new WeekDay(){
    		@Override
    		public WeekDay nextDay() {
    			return MON;
    		}
    	};
    	public final static WeekDay MON = new WeekDay(){
    		@Override
    		public WeekDay nextDay() {
    			return SUN;
    		}
    	};	
    	//  抽象方法-转移计算nextDay的逻辑
    	public abstract WeekDay nextDay();
    	
    	//普通的计算nextDay的方法,要用if...else推断
    	/*public WeekDay nextDay(){
    			if(this == SUN){
    				return  MON;
    			}else{
    				return SUN;
    			}
    		}
    	*/
    	//公有方法
    	public String toString(){
    		return this==SUN?"SUN":"MON";
    	}
    }

    7.  总结

      枚举是一个较特殊的“类”。枚举变量相当于枚举类的一个个对象。它定义一种规范,让枚举变量的取值必须符合它定义的规范,仅仅能为若干个固定值中的一个,从而在一定程度上防止了执行时的非法类型值错误.

     

  • 相关阅读:
    BZOJ4237:稻草人
    BZOJ4009:[HNOI2015]接水果(整体二分版)
    BZOJ3745:[COCI2015]Norma
    BZOJ3110:[ZJOI2013]K大数查询(整体二分版)
    BZOJ2716:[Violet 3]天使玩偶
    BZOJ2527:[POI2011]Meteors
    BZOJ4170:极光
    BZOJ1901:Dynamic Rankings
    Python基础终极实战 基于C/S架构的仿优酷项目
    大白话五种IO模型
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6913580.html
Copyright © 2011-2022 走看看