class SwitchTable {
private static class EventKey {
private EnumType parent;
private EnumType child;
public EventKey (EnumType p, EnumType c) { parent=p; child=c; }
public int HashCode () { ...something... }
}
private HashMap<EventKey, Integer> events;
public void setEvent (EnumType parent, EnumType child, int eventNumber) {
... add a map entry to events that maps new EventKey(parent,child)
... to eventNumber
}
public int whichEvent (EnumType parent, EnumType child) {
... return the map entry for new EventKey(parent,child) or 0 if not found
}
}
// do this once to set up
SwitchTable switches = new SwitchTable();
switches.setEvent (EnumType.DEPARTMENT, EnumType.TERMINAL, 1);
switches.setEvent (EnumType.DEPARTMENT, EnumType.OPERATOR, 2);
switches.setEvent (EnumType.OPERATOR, EnumType.TERMINAL, 3);
// then
switch (switches.whichEvent(parent, child)) {
case 1: event1(); break;
case 2: event2(); break;
case 3: event3(); break;
}
詳細をすべて記入するのは面倒ですが、お分かりいただけたでしょうか。これは、親と子が異なる列挙型であっても機能するはずです。SwitchTable に別の実装を使用することもできます (たとえば、HashMap の代わりにイベント値を保持するために 1 次元または 2 次元の配列をセットアップします)。私はこれをテストしておらず、速度に関してどのように比較されるかわかりません。愚かな構文エラーを犯していないことを願っています。
編集:whichEvent
整数を返す必要はありません。enum
実行したいアクションの種類を反映した名前を持つ新しいタイプにすることができます。これにより、可読性が向上するはずです。