我有一个休息端点,根据Enum值,我调用了特定服务的方法。所有服务都在同一抽象类之后扩展。
public abstract class BaseService{
someMethod()
}
public class ServiceA extends BaseService{
@Override
someMethod()
}
public class ServiceB extends BaseService{
@Override
someMethod()
}
public class RestEndpoint {
@Inject
ServiceA serviceA
@Inject
ServiceB serviceB
public void someEndpoint(Enum value){
switch (value){
case 1:
serviceA.someMethod();
case 2:
serviceB.someMethod();
}
}
}
问题是,可能会有更多的服务,我想知道是否有更好的方法。我考虑过实施策略模式,但是我不知道这是否不是“大材小用”,因为最多会有约10/15的服务。
编辑
所以因为我的服务是bean,并且在其中注入了其他bean,所以没有任何“简便”的方法来重构它-我无法在Enum类中创建某个方法,例如return new ServiceA()
,因为那样我的ServiceA
实例中的bean不会被注入。我可以尝试获取上下文并设置特定的bean,但是这样做并不安全(例如,您可以尝试注入非bean,而编译器不会让您知道它)。
因此,如果我的BaseService
实现不使用其他bean,最简单的方法是在Enum类中创建方法
public abstract BaseService getService();
并像这样实现
anyServiceA{
@Override
public BaseService getService(){
return new ServiceA();
}
}
在Rest服务中,只需致电value.getService().someMethod();
也许会帮助某人。
答案 0 :(得分:5)
通常,重构开关语句有7种方法可用(可能更多:)。
1) Implementing the Strategy Pattern via Java Enum
2) Implementing the Command Pattern
3) Using the Java 8+ Supplier
4) Defining a Custom Functional Interface
5) Relying on Abstract Factory
6) Implementing State Pattern
7) Implementing via Predicate
您可以参考此链接进行实施
https://www.developer.com/java/data/seven-ways-to-refactor-java-switch-statements.html
希望这可以为您提供帮助。
答案 1 :(得分:0)