使用处理逻辑进行枚举实现是否很好?

时间:2016-09-15 08:07:10

标签: java enums java-8 solid-principles

在下面的示例中,Enums执行类将执行的处理量。

enum TriggerHandlerType {
    DASHBOARD {
        @Override
        TriggerHandler create() {
            return new DashboardTriggerHandler();
        }
    },
    COMPONENT_HANDLER {
        //...
    };

    abstract TriggerHandler create();
}

private static TriggerContext getTriggerContext(TriggerHandlerType triggerHandlerType) throws TriggerHandlerException {
    return new TriggerContext(triggerHandlerType.create());
}

枚举通常用于常量的类型安全存储,在这种情况下,它们将根据处理逻辑返回不同的值。在某种程度上,它似乎是一种综合技术,因为Enums在这里进行状态确定,这简化了类的处理。此外,由于返回值是有限值的子集,因此使Enums本身处理处理似乎有些意义。

我确实在这里看到问题,这会破坏 SOLID 中的打开 - 关闭原则,只要添加更多枚举,类就会增加代码行数,可以有人分享你对此的看法吗?

2 个答案:

答案 0 :(得分:0)

真正的答案是:取决于为...定义的枚举。

你可以定义枚举,使你的API客户端不断实现一些功能作为语法糖......

一个很好的例子是java TimerUnit,其中每个常量都是可以用来计算时间转换的final类

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TimeUnit.html#toHours(long)

其他枚举实现比较器接口并在其常量中实现已定义的排序标准..

所有这些都是有效的,因为是辛辣糖

答案 1 :(得分:0)

我有一个枚举,执行OR,AND,SEQ等操作。

使用java 8和一个overriden方法,您还可以创建一个带有功能接口的构造函数作为参数。

enum TriggerHandlerType {
    DASHBOARD(() -> DashboardTriggerHandler::new)),
    COMPONENT_HANDLER (() -> { ... });

    private final Fun fun;

    private TriggerHandlerType(Fun fun) {
        this.fun = fun;
    }

    public TriggerHandler create() {
        fun.apply();
    }
}

在另一种情况下,我没有使用这种技术来解耦类,并且有明确的类层。 enum是一个尚未使用后​​期课程的早期课程。

从枚举映射到处理程序也是OO。单元测试可能会检查创建的地图的大小是否等于枚举值'。

我不必说,枚举是一种人工耦合。固定数量的元素与否,可以使单独的类/单例

所以它取决于。