求《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); } } }
代码说明
这段代码通过两步显式迭代完成初始化:
- 先遍历所有
Phase枚举值,为每个Phase创建对应的内层EnumMap,确保每个起始Phase都有一个空的映射容器; - 再遍历所有
Transition枚举实例,将每个转换关系放入对应的内层Map中。
相比第3版的Stream实现,这段代码的逻辑更直白,每一步操作都清晰可见,对于新手来说更容易理解初始化的完整流程,不需要理解Stream收集器的嵌套用法和参数含义。
内容的提问来源于stack exchange,提问作者Nick Knatterton
相关产品推荐
相关产品推荐

