枚举的作用是在编译时阻止数据不合法,规范数据类型。
一:用普通类模拟枚举实现原理
在主类中
public class Enum {
public static void main(String[] args) {
// 定义的对象及为枚举对象的属性 每一个枚举都是一个对象
WeekDay1 weekday = WeekDay1.SUN;
System.out.println(weekday);
}
}
模拟枚举类型类
/*
* 创建枚举对象
*/
public abstract class WeekDay1 {
private WeekDay1() {
}
// 定义常量
/*
public static final WeekDay SUN = new WeekDay();
public static final WeekDay MON = new WeekDay();
*/
// 定义方法
/*public WeekDay nextDay() {
if (this == SUN) {
return MON;
} else {
return SUN;
}
}*/
//抽象类 常量定义必须继承子类 子类为匿名内部类,继承父类中的抽象方法
public static final WeekDay1 SUN=new WeekDay1(){
@Override
public WeekDay1 nextDay() {
return MON;
}
};
public static final WeekDay1 MON=new WeekDay1() {
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
//为了省去nextDay中的if...else方法,可以将方法定义为抽象方法 类就为抽象类了。
public abstract WeekDay1 nextDay();
// 打印常量的值必须覆盖tostring方法
public String toString() {
return this == SUN ? "SUNDAY" : "MONDAY";
}
}
ps:
采用抽象方法定义nextDay就将大量的if...else语句转移成了一个个独立的类。
在一个个独立的类中编写方法就要继承调用类的内部类
二:采用enum
// 编写枚举
public class EnumBase {
public static void main(String[] args) {
WeekDay wd = WeekDay.MON;
System.out.println(wd);
System.out.println(wd.name());
System.out.println(wd.ordinal());
System.out.println(WeekDay.valueOf("SUN")); // 将字符串转化为枚举对象
System.out.println(WeekDay.values().length);
System.out.println(trafficLamp.Red.nextLamp());
}
public enum WeekDay {
SUN(1), MON, SAT, TUE;
// 编写构造方法 构造方法必须为私有private类型
private WeekDay() {
System.out.println("first");
}
private WeekDay(int day) {
System.out.println("second");
}
}
// 编写带上抽象方法的枚举
public enum trafficLamp {
// 枚举类熟悉相当于对象,实现抽象方法
Red(30) {
public trafficLamp nextLamp() {
time--;
System.out.println(time);
return Green;
}
},
Yellow(45) {
public trafficLamp nextLamp() {
return Red;
}
},
Green(5) {
public trafficLamp nextLamp() {
return Yellow;
}
};
// 抽象方法
public abstract trafficLamp nextLamp();
// 带参数构造方法
public int time;
private trafficLamp(int time) {
this.time = time;
}
}
}