https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
一、基本用法
Java 枚举用于构建一组固定的常量。
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
所有的 Java 枚举类型,都隐式地继承 java.lang.Enum。
Java 的枚举可以强大到拥有属性和方法。
下面模拟一个交通信号灯,每个信号灯有个 time 属性代表亮的时间。
public enum TrafficLamp{
RED(30), GREEN(20), YELLOW(10);
private final int time;
public final int getTime(){
return this.time;
}
// constructor
TrafficLamp(int _time){
this.time = _time;
}
}
属性和方法我们一般都是定义成 final 的。
注意:枚举类型的构造器必须是 包级私有(package-private) 或是 私有(private)的,并且我们不能调用枚举的构造方法。
枚举遍历:
for (TrafficLamp lamp : TrafficLamp.values()){
System.out.println(lamp.name());
}
name() 方法用于获取枚举常量的名字。
二、构建“状态机”
Java 枚举类型还可以拥有 抽象方法,在定义枚举常量时,必须实现该抽象方法:
public enum TrafficLamp{
RED(30){
@Override
public TrafficLamp nextLamp() {
return GREEN;
}
},
GREEN(20){
@Override
public TrafficLamp nextLamp() {
return YELLOW;
}
},
YELLOW(10){
@Override
public TrafficLamp nextLamp() {
return RED;
}
};
private final int time;
public final int getTime(){
return this.time;
}
// constructor
TrafficLamp(int _time){
this.time = _time;
}
// abstract
public abstract TrafficLamp nextLamp();
}
至此,上面的每个信号灯实现的 nextLamp() 方法返回下一个信号灯,恰好“闭环”,有点像数电里面的“状态机”。
现在模拟主线程 sleep 等待每个信号灯亮对应的时间:
public static void main(String[] args) throws InterruptedException {
TrafficLamp curLamp = TrafficLamp.RED;
while (true){
System.out.println(curLamp.name() + "亮,等待 " + curLamp.getTime() + " 秒...");
TimeUnit.SECONDS.sleep(curLamp.getTime());
curLamp = curLamp.nextLamp();
}
}