You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取无继承关系Java类的公共处理逻辑?

提取公共逻辑的几种可行方案

针对你遇到的无继承关系类的公共逻辑提取问题,这里有几种实用的解决思路:

方案一:定义数据提取接口 + 适配器类

这种方式不需要修改原有ClassA、ClassB的代码,通过适配器类统一数据提取逻辑:

  1. 定义统一的数据提取接口:
public interface DataExtractor {
    Object[] extractData();
}
  1. 为每个类编写对应的适配器:
// 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()};
    }
}
  1. 编写公共处理方法:
public void commonFunction(DataExtractor extractor) {
    // 这里是原来functionA和functionB的公共逻辑
    ...
    Object[] obj = extractor.extractData();
    ...
}
  1. 调用方式:
commonFunction(new ClassAExtractor(classAInstance));
commonFunction(new ClassBExtractor(classBInstance));

方案二:使用Java 8+函数式接口(更简洁)

利用Java 8的函数式编程特性,直接传入数据提取逻辑,省去适配器类:

  1. 编写公共方法,接收目标对象和对应的提取函数:
import java.util.function.Function;

public <T> void commonFunction(T obj, Function<T, Object[]> dataExtractor) {
    // 公共逻辑部分
    ...
    Object[] objArray = dataExtractor.apply(obj);
    ...
}
  1. 调用方式:
// 处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 15:50:16