Enum внутри enum

Дело не в том, что я застрял, а в том, что я ищу аккуратный способ написания кода.

По сути, я пишу приложение, управляемое событиями. Пользователь вызывает событие, событие посылается соответствующим объектам, а объекты обрабатывают события. Сейчас я работаю над написанием методов обработчика событий, и я надеялся использовать операторы 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. Надеюсь, есть лучший способ! (О, и производительность имеет значение в моем случае, если это поможет)

29
задан Fault 4 January 2012 в 19:22
поделиться