枚举中的枚举

2022-09-01 06:00:16

这不是我被困住的问题,而是我正在寻找一种整洁的方式来编写我的代码。

从本质上讲,我正在编写一个事件驱动的应用程序。用户触发事件,事件被发送到相应的对象,对象处理事件。现在我正在编写偶数处理程序方法,我希望使用 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 类型的操作,然后进一步标识它具体位于 UP 方向。这只是一个简单的例子,如果我也能制作更长的链条,比如“DELETE。第1页。第2款。句子2.字11.字母3”。在我看来,我只需要使用字符串和许多if/else语句。希望有更好的方法!(哦,就我而言,性能很重要,如果这有帮助的话)


答案 1

我相信在Java中,你可以简单地嵌套枚举,只要你的非枚举常量放在第一位。

enum Action
{
    FOO,
    BAR;
    enum MOVE
    {
         UP,
         DOWN,
         LEFT,
         RIGHT 
    }
}

这为我编译,并给了我你一直在寻找的行为。


答案 2

也许对事件使用继承层次结构?

所以你有:

- abstract Event
-- MoveEvent(Direction)
-- FooEvent()
-- BarEvent()

拥有以下功能可能更有意义:

- abstract Event
-- abstract MoveEvent
--- MoveUpEvent
--- MoveDownEvent
--- MoveRightEvent
--- MoveLeftEvent
-- FooEvent
-- BarEvent

如果所有 Move 事件都有一个距离,则将其传递到 MoveEvent 构造函数中(这将波纹向下)。