如何提取无继承关系Java类的公共处理逻辑?
提取公共逻辑的几种可行方案
针对你遇到的无继承关系类的公共逻辑提取问题,这里有几种实用的解决思路:
方案一:定义数据提取接口 + 适配器类
这种方式不需要修改原有ClassA、ClassB的代码,通过适配器类统一数据提取逻辑:
- 定义统一的数据提取接口:
public interface DataExtractor { Object[] extractData(); }
- 为每个类编写对应的适配器:
// ClassA的适配器 public class ClassAExtractor implements DataExtractor { private ClassA a; public ClassAExtractor(ClassA a) { this.a = a; } @Override public Object[] extractData() { return new Object[]{a.getA2()}; } } // ClassB的适配器 public class ClassBExtractor implements DataExtractor { private ClassB b; public ClassBExtractor(ClassB b) { this.b = b; } @Override public Object[] extractData() { return new Object[]{b.getB1(), b.getB2(), b.getB3()}; } }
- 编写公共处理方法:
public void commonFunction(DataExtractor extractor) { // 这里是原来functionA和functionB的公共逻辑 ... Object[] obj = extractor.extractData(); ... }
- 调用方式:
commonFunction(new ClassAExtractor(classAInstance)); commonFunction(new ClassBExtractor(classBInstance));
方案二:使用Java 8+函数式接口(更简洁)
利用Java 8的函数式编程特性,直接传入数据提取逻辑,省去适配器类:
- 编写公共方法,接收目标对象和对应的提取函数:
import java.util.function.Function; public <T> void commonFunction(T obj, Function<T, Object[]> dataExtractor) { // 公共逻辑部分 ... Object[] objArray = dataExtractor.apply(obj); ... }
- 调用方式:
// 处理ClassA commonFunction(classAInstance, a -> new Object[]{a.getA2()}); // 处理ClassB commonFunction(classBInstance, b -> new Object[]{b.getB1(), b.getB2(), b.getB3()});
这种方式代码更紧凑,新增类时只需要添加对应的lambda表达式即可,扩展性很好。
方案三:反射(不推荐,仅作参考)
如果类的数量极多且属性提取有规律(比如属性名有统一规则),可以用反射实现,但要注意反射的性能开销和类型安全问题:
import java.lang.reflect.Method; public void commonFunction(Object obj, String... methodNames) throws Exception { // 公共逻辑部分 ... Object[] objArray = new Object[methodNames.length]; for (int i = 0; i < methodNames.length; i++) { Method method = obj.getClass().getMethod(methodNames[i]); objArray[i] = method.invoke(obj); } ... }
调用方式:
// 处理ClassA,传入getA2方法名 commonFunction(classAInstance, "getA2"); // 处理ClassB,传入getB1、getB2、getB3方法名 commonFunction(classBInstance, "getB1", "getB2", "getB3");
注意:反射会降低代码可读性和性能,且编译期无法检查方法名是否正确,非必要不建议使用。
内容的提问来源于stack exchange,提问作者TriNauD
相关产品推荐
相关产品推荐

