有处理逻辑的枚举实现好吗?

Is it good to have enum implementation with processing logic?

在下面的示例中,枚举执行 class 会执行的处理量。

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());
}

枚举通常用于常量的类型安全存储,在这种情况下,它们将 returning 基于处理逻辑的不同值。在某种程度上,它似乎是一种综合技术,因为这里的枚举本身会确定状态,从而简化 classes 的处理。此外,由于 return 值是有限值的子集,因此由枚举本身处理处理似乎是有意义的。

我确实看到这里有问题,这会破坏 SOLID 中的 Open-Close 原则,而 class 将有每当添加更多枚举时,代码行就会增加,有人可以分享您对此的看法吗?

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

您可以定义枚举来执行您的 API 客户端不断实现的某些功能作为语法糖...

一个很好的例子是 java TimerUnit,其中每个常量都是最终的 class,可用于计算时间转换

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

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

所有这些都是有效的,因为它们是语法糖

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

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

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

    private final Fun fun;

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

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

在另一种情况下,我没有使用这种技术来解耦 classes,并且具有清晰的 classes 层级。枚举是早期的 class 尚未使用后​​来的 classes.

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

不用说了,那个枚举是人为的耦合。元素数量固定与否,可以分开classes/singletons.

所以这取决于。