1. 类型安全性
 java.util.*<span style="color: #0000ff;">public <span style="color: #0000ff;">enum<span style="color: #000000;"> Phase {
SOLID,LIQUID,GAS;
<span style="color: #0000ff;">public <span style="color: #0000ff;">enum<span style="color: #000000;"> Transition {
MELT(SOLID,LIQUID),FREEZE(LIQUID,SOLID),BOIL(LIQUID,GAS),CONDENSE(
GAS,SUBLIME(SOLID,DEPOSIT(GAS,SOLID);
<span style="color: #0000ff;">private <span style="color: #0000ff;">final<span style="color: #000000;"> Phase src;
<span style="color: #0000ff;">private <span style="color: #0000ff;">final<span style="color: #000000;"> Phase dst;
    Transition(Phase src,Phase dst) {
        </span><span style="color: #0000ff;">this</span>.src =<span style="color: #000000;"> src;
        </span><span style="color: #0000ff;">this</span>.dst =<span style="color: #000000;"> dst;
    }
    </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">final</span> Map<Phase,Map<Phase,Transition>> m = <span style="color: #0000ff;">new</span> EnumMap<Phase,Transition>><span style="color: #000000;">(
            Phase.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);
    </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> {
        </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (Phase p : Phase.values())
            m.put(p,</span><span style="color: #0000ff;">new</span> EnumMap<Phase,Transition>(Phase.<span style="color: #0000ff;">class</span><span style="color: #000000;">));
        </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (Transition trans : Transition.values())
            m.get(trans.src).put(trans.dst,trans);
    }
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> Transition from(Phase src,Phase dst) {
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> m.get(src).get(dst);
    }
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
    </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (Phase src : Phase.values())
        </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (Phase dst : Phase.values())
            </span><span style="color: #0000ff;">if</span> (src !=<span style="color: #000000;"> dst)
                System.out.printf(</span>"%s to %s : %s %n"<span style="color: #000000;">,src,dst,Transition.from(src,dst));
}
}