java高新技术-枚举
1.什么是枚举
枚举是jdk1.5后才增加的新特性
用枚举就是要规定一个新的类型,那么要用这个类型的值就必须是我规定的那些值。如果不是那些值,编译器就会报错,好处是编译时就会做出判断
2.用普通类模拟枚举的实现原理
package com.java.javaenhance1; /** * 用普通的java类,来实现枚举的原理 * 这个类所定义出来的值只能是那么几个,这个值不是一个普通基本类型的值,而是一个对象 * @author Administrator * */ public class WeekDay { private WeekDay() { } public final static WeekDay SUN = new WeekDay(); public final static WeekDay MON = new WeekDay(); public WeekDay nextDay() { if (this == SUN) { return MON; } else { return SUN; } } public String toString() { return this == SUN ? "SUN" : "MON"; } }
package com.java.javaenhance1; public class EnumTest { public static void main(String[] args) { WeekDay weekDay = WeekDay.SUN; System.out.println(weekDay.nextDay()); //MON System.out.println(weekDay.toString()); //SUN } }
这里还可以使用抽象方法的方式实现nextDay(),就将大量的if.else语句转义成了一个个独立的类。
package com.java.javaenhance1; /** * 用普通的java类,来实现枚举的原理 * 这个类所定义出来的值只能是那么几个,这个值不是一个普通基本类型的值,而是一个对象 * @author Administrator * */ public abstract class WeekDay { private WeekDay() { } //带一个{} 表示匿名子类 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 WeekDay nextDay() { if (this == SUN) { return MON; } else { return SUN; } }*/ //nextDay分别有子类去完成 public abstract WeekDay nextDay(); public String toString() { return this == SUN ? "SUN" : "MON"; } }
3.java5的枚举的基本应用
package com.java.javaenhance1; public class EnumTest { public static void main(String[] args) { WeekDay weekDay2 = WeekDay.FRI; System.out.println(weekDay2); //FRI 枚举自己实现了toString() System.out.println(weekDay2.name());//FRI System.out.println(weekDay2.ordinal()); //5 元素中排第几,第一个从0开始 //把一个字符串变成一个对象的枚举元素 System.out.println(WeekDay.valueOf("SUN")); //SUN //把枚举中的所有元素装进数组里,可用于遍历 System.out.println(WeekDay.values().length); //7 } /** * 枚举相当于一个类,枚举中的元素相当于这个类搞出来的实例对象 * @author Administrator * */ public enum WeekDay{ SUN,MON,TUE,WED,THI,FRI,SAT } }
4.实现带有构造方法的枚举(带有参数的构造方法)
/** * 枚举相当于一个类,枚举中的元素相当于这个类搞出来的实例对象 * @author Administrator * */ public enum WeekDay{ SUN(1),MON,TUE,WED,THI,FRI,SAT; //定义的所有其他信息必须位于元素之后 private WeekDay(){System.out.println("first");} //构造方法必须是private类型的 private WeekDay(int day){System.out.println("second");} }
在枚举元素的后边跟上一个括号,()中的参数代表元素初始化时用的哪个构造方法,如果没有(),表示调用默认空参构造器
5.实现带有抽象方法的枚举
内部类前边可以有4中访问修饰符,外部类只有两种,public和默认
带有抽象方法的枚举,元素需要实现抽象的方法,使用RED{} 匿名子类的方式
RED(30) 表示构造实例对象时用的是哪个构造方法
public enum TrafficLamp{ RED(30){ //使用内部类方式实现抽象类 @Override public TrafficLamp nextLamp() { return GREEN; } }, GREEN(45){ @Override public TrafficLamp nextLamp() { return YELLOW; } }, YELLOW(5){ @Override public TrafficLamp nextLamp() { return RED; } }; public abstract TrafficLamp nextLamp(); private int time; private TrafficLamp(int time){this.time = time;} }
经过编译后,会自动生成子类的 .class文件
枚举只有一个成员时,就可以作为一种单例的实现方式。
如果要写一个单例,就可以写一个枚举,只有一个元素。