首页 > 解决方案 > 在 Spring Boot 应用程序中处理接口的具体实现中的重复代码

问题描述

我正在开发一个 Spring Boot 应用程序,我的界面I如下:

public interface I {

   String getType();

   void f1();

}

有两个类实现接口I如下:

@Component
class A implements I {
   
    private final MyRepo1 myRepo1;
    private final Helper helper;

    public A(MyRepo1 myRepo1, Helper helper) {
       this.myRepo1 = myRepo1;
       this.helper = helper;
    }

    @Override
    public String getType() {
        return "type1";
    }

    @Override
    public void f1(String type) {
        int response = helper.f1(type);
        if(response != -1) {
           return;
        }
        //Add type1 specific handling here
    }
 }

另一类 B 实现接口 I 如下:

@Component
class B implements I {
    private final MyRepo2 myRepo2;
    private final Helper helper;

    public B(MyRepo2 myRepo2, Helper helper) {
       this.myRepo2 = myRepo2;
       this.helper = helper;
    }

    @Override
    public String getType() {
        return "type2";
    }

    @Override
    public void f1(String type) {
        int response = helper.f1(type);
        if(response != -1) {
           return;
        }
        //Add type2 specific handling here
    }
}

助手如下:

@Component
class Helper {

    public int f1(String type) {
      ...
    }
} 

我有一个工厂类如下,用于获取适当类型的对象:

@Component
public class ServiceFactory {

  private final Map<String, I>
      typeToClassMap = new HashMap<>();

  public ServiceFactory(List<I> components) {
      for(I component : components) {
          typeToClassMap.put(component.getType(), component);
      }
  }
}

ServiceFactory基本上用于根据类型获取对象。

现在,问题是,为了简单起见,我只展示了两个实现接口的类。但实际上,我有比这更多的类来实现接口I

某些类可能具有相同的实现f1(),从而导致重复代码。

我不能f1()作为接口中的默认方法,I因为这需要依赖 bean。

我无法理解处理此问题的最佳方法是什么。

有人可以帮忙吗?

标签: javaspringspring-boot

解决方案


推荐阅读