如何重构多个交换语句

时间:2019-07-18 05:32:05

标签: java design-patterns refactoring

我有一个休息端点,根据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();

也许会帮助某人。

2 个答案:

答案 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)