Java Enum 枚举

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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值