Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用处理逻辑实现enum好吗?_Java_Enums_Java 8_Solid Principles - Fatal编程技术网

Java 使用处理逻辑实现enum好吗?

Java 使用处理逻辑实现enum好吗?,java,enums,java-8,solid-principles,Java,Enums,Java 8,Solid Principles,在下面的示例中,枚举执行类将执行的处理量 enum TriggerHandlerType { DASHBOARD { @Override TriggerHandler create() { return new DashboardTriggerHandler(); } }, COMPONENT_HANDLER { //... }; abstract TriggerHa

在下面的示例中,枚举执行类将执行的处理量

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());
}
枚举通常用于常量的类型安全存储,在这种情况下,它们将根据处理逻辑返回不同的值。在某种程度上,它似乎是一种全面的技术,因为这里的枚举本身进行状态确定,从而简化了类的处理。此外,由于返回值是有限值的子集,因此由枚举本身处理处理似乎有一定意义


我确实看到了这里的问题,这将打破SOLID中的开闭原则,并且每当添加更多枚举时,该类的代码行将增加,有人能分享您对此的想法吗?

真正的答案是:取决于枚举定义的目的

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

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

其他枚举实现comparator接口,并在其已定义的排序标准中实现


所有这些都是有效的,因为sintax sugar就是这样一个枚举,执行诸如OR、AND、SEQ之类的操作

使用Java8和一个被重写的方法,您还可以创建一个以函数接口作为参数的构造函数

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。单元测试可以检查创建的映射的大小是否等于“枚举值”

我不需要说,enum是一个人工耦合。无论元素的数量是否固定,都可以使单独的类/单例


所以这要看情况。

这取决于上下文,在这种情况下,这是一个糟糕的想法。@DavidPérezCabrera感谢我在Github中看到这段代码的评论,我认为这比使用不同的具体类、切换案例或哈希映射更容易实现,为什么你认为这很糟糕!任何具体的reason@RealSkeptic我同意!,我从github中获取了它,我删除了它并创建了一个,只是看一看,希望现在Enum是类,这很有意义。它们不仅仅是int常量的类型安全替代品。打开/关闭取决于其他实现详细信息,而不取决于是否使用枚举。Enum的缺点是您无法扩展(子类化)它们,所以它们是封闭的。有人可以分享您对此的想法吗?不是StackOverflow的适当问题。这不是一个讨论论坛。请提出一个能客观回答的问题。见和。