黑马程序员:jdk1.5新特性2 (枚举)

 

枚举

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

          在开发阶段无法实现这一目标。

如何实现枚举
1 私有的构造方法
2 每个元素分别用一个公有的静态成员变量表示
3 可以有若干公有方法或抽象方法 ,例如要提供nextDay方法 必须是抽象的。采用抽象方法定义nextDay 就将大量的if.else语句转化为一个个独立的类。
4 在枚举元素的后面 跟着()就表示创建这个枚举元素使用的哪个构造方法
  用一个简单的类来实现枚举
public abstract class WeekDay {
 private WeekDay(){} 
 public final static WeekDay SUN=new WeekDay(){
    public WeekDay nextDay() {                 //内部类
     return MON;
    }   };  
 public final static WeekDay MON=new WeekDay(){
  public WeekDay nextDay() {
   return FRE;
  }  };
 public final static WeekDay FRE=new WeekDay(){
  public WeekDay nextDay() {
   return SUN;
  }   };
   public abstract WeekDay nextDay() ;     //抽象方法
   public String toString(){
    if(this==MON){
     return "MON";
    }else  if(this==SUN){
     return  "SUN";
     } else{
     return "FRE";     }
   /* return this==MON?"MON":"SUN"*/
   }   }

创建一个枚举,并将里面的对象 以for增强的 方法输出
public class EnumTest {
   public static void main(String[] args) {  
     //  int len=WeekDay1.values().length;
       WeekDay1[] weeks=WeekDay1.values();
       for(WeekDay1 week:weeks){
        System.out.println("WeekDay1 everyday:"+week);
       }    }
    public enum WeekDay1{
        MON(1),TUE,WEN,THU,FRI,SAT,SUN; //后面跟构造方法时 必须有“;”
      private WeekDay1(){}
      private WeekDay1(int day){}
 }       }

带有抽象方法的枚举(交通灯)
public 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 TrafficLamp(int time){this.time=time;}
 private int time;
}

*枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法
*枚举元素必须位于枚举体中的最开始部分,枚举元素列表后 要有“;”与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素前面,编译器会报错。
*带构造方法的枚举
   1 枚举必须定义为私有
   2 如果有多个构造方法,看枚举元素后面的括号 MON和MON()都是调用的默认构造方法
      MON(int time) 调用的 有参数的构造方法
*带方法的枚举 :如上例(交通灯)TrafficLamp枚举,可实现普通的next()也可实现抽象的next():

   每个元素分别是由枚举的子类来生成的实例对象,这些子类采用类似内部 类的方式进行定义
*枚举只有一个成员时 就可以作为一种单例的实现方式(同static创建单一实例对象相仿并且更简单)

你可能感兴趣的:(jdk,String,Class,sun,交通,编译器)