一、枚举类型——使用EnumMap

EnumMap 是一种特殊的 Map,它要求自身所有的键来自某个枚举类型。由于枚举的约束(元素和索引的映射关系与数组相似),EnumMap 的内部可以作为一个数组来实现,因此它们的性能非常好,你可以放心地用 EnumMap 来实现基于枚举的查询。

你只能用枚举中的元素作为键来调用 put() 方法,除此之外,就和调用一个普通的 Map 没什么区别了。

下面的例子演示了设计模式中的命令模式。这种模式由一个(通常)只包含一个方法的接口开始,然后为该方法创建多个具有不同行为的实现。只需要配置好这些命令对象,程序就会根据需要来调用它们。

EnumMaps.java

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

import static enums.TEST0523.AlarmPoints.*;

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("Expected: " + e);
        }
    }
}

运行结果如下:
一、枚举类型——使用EnumMap_第1张图片

和 EnumSet 一样,EnumMap 中的元素顺序由它们在枚举中定义的顺序决定。

通过 main() 函数中的末尾部分,可以看到每个枚举都有个键,但是值都是 null ,除非在该键上调用过 put() 方法。

相较于常量特定方法 EnumMap 的优势在于:利用 EnumMap ,你可以改变值对象。而你可以看到常量特定方法在编译时是不可变的。

正如你在本章稍后会看到的,EnumMap 支持多路分发(multiple dispatching),以应对多个类型的枚举共存且相互影响的各种场景。

你可能感兴趣的:(#,On,Java,进阶卷,枚举类型,EnumMap)