有处理逻辑的枚举实现好吗?
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.
所以这取决于。
在下面的示例中,枚举执行 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.
所以这取决于。