如何创建兼容两个相似接口的成员?合并同类类的优雅方案
优雅合并ClassC与ClassD的方案
1. 重构泛型统一接口
先消除InterfaceA和InterfaceB的重复定义,替换为一个泛型接口:
public interface VariationProvider<T> { T getVariation(); }
让原有实现类分别实现这个泛型接口:
public class InterfaceAImpl implements VariationProvider<VariationA> { @Override public VariationA getVariation() { // 原InterfaceAImpl的业务逻辑 return new VariationA(); } } public class InterfaceBImpl implements VariationProvider<VariationB> { @Override public VariationB getVariation() { // 原InterfaceBImpl的业务逻辑 return new VariationB(); } }
2. 泛型化目标类
将ClassC和ClassD合并为一个泛型类,结合Spring依赖注入处理不同实现,用Lombok简化代码:
import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @Component @Getter @RequiredArgsConstructor public class UnifiedClass<T> { private final VariationProvider<T> variationProvider; // 原ClassC和ClassD的所有公共功能方法都放在这里 public void commonBusinessLogic() { T variation = variationProvider.getVariation(); // 统一的业务处理逻辑 } }
3. 按需注入使用
在需要原ClassC/ClassD功能的地方,通过Spring注入指定泛型的实例,用@Qualifier区分不同实现:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component public class BusinessService { private final UnifiedClass<VariationA> classCEquivalent; private final UnifiedClass<VariationB> classDEquivalent; @Autowired public BusinessService( @Qualifier("interfaceAImpl") VariationProvider<VariationA> providerA, @Qualifier("interfaceBImpl") VariationProvider<VariationB> providerB ) { this.classCEquivalent = new UnifiedClass<>(providerA); this.classDEquivalent = new UnifiedClass<>(providerB); } public void execute() { classCEquivalent.commonBusinessLogic(); classDEquivalent.commonBusinessLogic(); } }
这种方案通过泛型抽象消除重复类,利用Spring依赖注入解耦不同实现,再借助Lombok减少样板代码,完全保留原有功能的同时实现了代码复用。
内容的提问来源于stack exchange,提问作者תומר ש
相关产品推荐
相关产品推荐

