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)。我没有对此进行测试,也不知道它在速度方面的比较。我希望我没有犯任何愚蠢的语法错误。
编辑:whichEvent
不必返回整数。您可以将其设为一种新enum
类型,其名称反映了您可能想要采取的各种操作。这应该会提高可读性。