【问题标题】:Using enum to handle integer event types使用枚举处理整数事件类型
【发布时间】:2017-09-15 15:22:50
【问题描述】:

我对 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;
        }
    }
}

【问题讨论】:

    标签: java enums


    【解决方案1】:

    我更喜欢使用枚举的策略模式实现。查看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;
                }
            }
        }
    }
    

    【讨论】:

    • 不幸的是,EventId 将不等于序数。有没有办法处理分散的事件 id 值?
    猜你喜欢
    • 2020-11-11
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2012-12-01
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多