Дело не в том, что я застрял, а в том, что я ищу аккуратный способ написания кода.
По сути, я пишу приложение, управляемое событиями. Пользователь вызывает событие, событие посылается соответствующим объектам, а объекты обрабатывают события. Сейчас я работаю над написанием методов обработчика событий, и я надеялся использовать операторы switch для определения того, как обработать событие. Сейчас, пока я работаю над общей структурой, класс событий очень прост:
public class Event {
public static enum Action {
MOVE, FOO, BAR
}
private Action action;
private int duration;
public Event(Action action, int duration) {
this.action = action;
this.duration = duration;
}
public Action getAction() {
return action;
}
public int getDuration() {
return duration;
}
Затем, в другом классе, у меня будет что-то вроде:
public void handleEvent(Event evt) {
switch(Event.getAction()) {
case MOVE: doSomething(); break;
case FOO: doSomething(); break;
case BAR: doSomething(); break;
default: break;
}
}
То, что я хотел бы сделать, выглядит примерно так (хотя, конечно, я бы засунул операторы switch в их собственные функции, чтобы избежать превращения в неприятный клубок переключателей и случаев):
public void handleEvent(Event evt) {
switch(Event.getAction()) {
case MOVE: switch(Event.getAction()) {
case UP: break;
case DOWN: break;
case LEFT: break;
case RIGHT: break;
}
case FOO: break;
case BAR: break;
default: break;
}
}
Итак, я хотел бы создать вложенные перечисления. ... примерно так:
public static enum Action {
public enum MOVE {UP, DOWN, LEFT, RIGHT}, FOO, BAR
}
Не то чтобы я не мог избежать этого сценария, просто это было бы... удобно. Так что, хотя вышеописанное не работает, есть ли какой-то похожий метод для достижения этого? Было бы здорово, если бы я мог послать событие с действием "MOVE.UP", и метод определил бы его сначала как действие типа MOVE, а затем определил бы, что оно направлено именно вверх. Это всего лишь простой пример, было бы здорово, если бы я мог создавать и более длинные цепочки, что-то вроде "DELETE.PAGE1.PARAGRAPH2.SENTENCE2.WORD11.LETTER3". Как я вижу, мне придется использовать строки и множество операторов if/else. Надеюсь, есть лучший способ! (О, и производительность имеет значение в моем случае, если это поможет)