使用EnumMap实现多路分发(multiple dispatching):Thing In Java

EnumMap是一种特殊的Map,它要求其中的键(key)必须来自一个enum。由于enum本身的限制,所以EnumMap在内部可由数组实现。因此EnumMap的速度很快,我们可以放心地使用enum实例在EnumMap中进行查找操作。不过,我们只能将enum的实例作为键来调用put()方法,其他操作与使用一般的Map差不多。

下面的例子演示了命令设计模式的用法。一般来说,命令模式首先需要一个只有单一方法的接口,然后从该接口实现具有各自不同的行为的多个子类。接下来,程序员就可以构造命令对象,并在需要的时候使用它们了:

package lime.tij._019._009._000;

import lime.tij._019._008._000.AlarmPoints;

import java.util.EnumMap;
import java.util.Map;

import static lime.tij._019._008._000.AlarmPoints.*;

/**
 * @Author liangmy
 * @Date 2019/9/23
 */
interface Command {
    void action();
}

public class EnumMaps {
    public static void main(String[] args) {
        EnumMap<AlarmPoints, Command> em = new EnumMap(AlarmPoints.class);
        em.put(KITCHEN, () -> System.out.println("Kitchen fire!"));
        em.put(BATHROOM, () -> System.out.println("Bathroom alert!"));
        for(Map.Entry<AlarmPoints, Command> e : em.entrySet()){
            System.out.print(e.getKey() + " : ");
            e.getValue().action();
        }
        try{ // If there's no value for a particular key :
            em.get(UTILITY).action();
        }catch (Exception e){
            System.out.println(e);
        }
    }
}

和EnumSet一样,enum实例定义时的次序决定了其在EnumMap中的顺序。

main()方法的最后部分说明,enum的每个实例作为一个键,总是存在的。但是,如果你没有为这个键调用put()方法来存入相应的值的话,其对应的值就是null。

常量相关的方法(constant-specific methods将在下一节中介绍)相比,EnumMap有一个优点,那EnumMap允许程序员改变值对象,而常量相关的方法在编译期就被固定了。

稍后你会看到,在你有多种类型的enum,而且它们之间存在互操作的情况下,我们可以用EnumMap实现多路分发(multiple dispatching)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值