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的适当问题。这不是一个讨论论坛。请提出一个能客观回答的问题。见和。