使用enum处理整数事件类型

时间:2017-09-14 14:23:17

标签: java enums

我仍然不熟悉Java并试图实施最佳实践。我有一个课我想重构一下。我四处搜索,无法找到任何能够解决我问题的内容。

我有一个名为Definitions的类,它将所有事件名称映射到各自的事件ID。我有另一个类来解析名为EventHandler的事件。 EventHandler的switch语句变得非常大。我想减小处理程序方法的大小,以便代码更容易阅读。

我从下面截断了大约50个其他事件。在每种情况下,大约有20-30行代码。你可以想象这个switch语句有多大。

我的Definitions课程:

public class Definitions
{
    public static class EVENT
    {
        public static final int SEQUENCE_START = 10;
        public static final int SEQUENCE_HALT = 11;
        public static final int SEQUENCE_AUTHORIZED = 12;
    }
}

我的EventHandler课程:

public handledStack parse(IRPEventType buffer)
{
    final int eventId = Integer.parseInt(buffer.reader().parse("EventID"));


    switch (eventId)
    {
        case Definitions.EVENT.SEQUENCE_START:
        {
            // stuff happens here
            break;
        }

        case Definitions.EVENT.SEQUENCE_HALT:
        {
            // stuff happens here
            break;
        }
        case Definitions.EVENT.SEQUENCE_AUTHORIZED:
        {
            // stuff happens here
            break;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我更喜欢使用枚举的状态模式实现。查看Strategy pattern using Enums. Need a simple example in Java

interface Strategy {
    void execute(Object param);
}

enum EVENT implements Strategy {
    SEQUENCE_START(10) {
        @Override
        public void execute(Object param) {
            // stuff happens here
        }
    },
    SEQUENCE_HALT(11) {
        @Override
        public void execute(Object param) {
            // stuff happens here
        }
    },
    SEQUENCE_AUTHORIZED(12) {
        @Override
        public void execute (Object param){
            // stuff happens here
        }
    };

    private final int id;

    EVENT(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }
}

public class Test {

    public void handledStack parse(IRPEventType buffer) {
        final int eventId =     Integer.parseInt(buffer.reader().parse("EventID"));
        for (EVENT event : EVENT.values()) {
            if (event.getId() == eventId) {
                event.execute(param);
                break;
            }
        }
    }
}