You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求《Effective Java》第2版中EnumMap显式迭代初始化的代码示例

Effective Java第2版中显式迭代初始化Phase-Transition EnumMap的实现

以下是《Effective Java》第2版对应第33条(使用EnumMap而非序数索引)的显式迭代实现代码,替代第3版的Stream初始化方式:

public enum Phase {
    SOLID, LIQUID, GAS;

    public enum Transition {
        MELT(SOLID, LIQUID), FREEZE(LIQUID, SOLID),
        BOIL(LIQUID, GAS), CONDENSE(GAS, LIQUID),
        SUBLIME(SOLID, GAS), DEPOSIT(GAS, SOLID);

        private final Phase from;
        private final Phase to;

        Transition(Phase from, Phase to) {
            this.from = from;
            this.to = to;
        }

        // 显式迭代初始化Phase-Transition映射
        private static final Map<Phase, Map<Phase, Transition>> m = createTransitionMap();

        private static Map<Phase, Map<Phase, Transition>> createTransitionMap() {
            Map<Phase, Map<Phase, Transition>> map = new EnumMap<>(Phase.class);
            // 为每个Phase初始化内层EnumMap
            for (Phase p : Phase.values()) {
                map.put(p, new EnumMap<>(Phase.class));
            }
            // 遍历所有Transition,填充映射关系
            for (Transition t : Transition.values()) {
                map.get(t.from).put(t.to, t);
            }
            return map;
        }

        public static Transition from(Phase from, Phase to) {
            return m.get(from).get(to);
        }
    }
}

代码说明

这段代码通过两步显式迭代完成初始化:

  1. 先遍历所有Phase枚举值,为每个Phase创建对应的内层EnumMap,确保每个起始Phase都有一个空的映射容器;
  2. 再遍历所有Transition枚举实例,将每个转换关系放入对应的内层Map中。

相比第3版的Stream实现,这段代码的逻辑更直白,每一步操作都清晰可见,对于新手来说更容易理解初始化的完整流程,不需要理解Stream收集器的嵌套用法和参数含义。

内容的提问来源于stack exchange,提问作者Nick Knatterton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:41:29