Это не вопрос того, что я застрял, но я ищу аккуратный способ написать свой код.Enum in 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;
}
}
Что бы как сделать, это что-то вроде этого (хотя я, конечно, придерживаться переключающих заявлений в свои собственные функции, чтобы избежать его превращения в неприятную Hairball выключателей и случаев):
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, а затем еще раз определит, что он конкретно находится в направлении UP. Это просто простой пример, было бы ужасно, если бы я мог также создавать более длинные цепочки, что-то вроде «DELETE.PAGE1.PARAGRAPH2.SENTENCE2.WORD11.LETTER3». То, как я это вижу, мне просто придется использовать строки и множество операторов if/else. Надеюсь, есть лучший способ! (О, и производительность имеет значение в моем случае, если это помогает)
Я бы не использовал перечисление для описания ваших событий вообще. Перечисления лучше всего для счетного, постоянного набора состояний. UP, DOWN, LEFT, RIGHT хороши, потому что вряд ли они изменятся. MOVE, FOO, BAR чувствует, что это должно быть легко добавить. Вместо этого я бы использовал полиморфизм. (Каждое событие, реализующее doSomething, которое принимает состояние игры). – ILMTitan