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

如何编写通用可复用代码?外部Jar模型类映射优化问题

通用对象转换方案(解决外部Jar类无法修改的复用问题)

针对外部Jar中不可修改的com.Model.Trade、com.Model.Contact、com.Model.Email类,提供三种可复用的转换方案:

方案1:instanceof分支处理(直观无依赖)

直接在类型判断分支中完成字段提取,避免Object类型无法调用方法的问题。Java 16+可使用模式匹配简化代码:

private ErrorInfo mapErrorInfo(Object mapObject) {
    ErrorInfo errorInfo = new ErrorInfo();
    if (mapObject instanceof com.Model.Trade trade) {
        errorInfo.setErrorCode(trade.getErrorCode());
        errorInfo.setErrorDate(trade.getErrorDate());
    } else if (mapObject instanceof com.Model.Contact contact) {
        errorInfo.setErrorCode(contact.getErrorCode());
        errorInfo.setErrorDate(contact.getErrorDate());
    } else if (mapObject instanceof com.Model.Email email) {
        errorInfo.setErrorCode(email.getErrorCode());
        errorInfo.setErrorDate(email.getErrorDate());
    }
    // 可选:添加未知类型的处理逻辑(如抛异常、返回null)
    return errorInfo;
}

低版本Java可使用传统强转写法:

private ErrorInfo mapErrorInfo(Object mapObject) {
    ErrorInfo errorInfo = new ErrorInfo();
    if (mapObject instanceof com.Model.Trade) {
        com.Model.Trade trade = (com.Model.Trade) mapObject;
        errorInfo.setErrorCode(trade.getErrorCode());
        errorInfo.setErrorDate(trade.getErrorDate());
    } else if (mapObject instanceof com.Model.Contact) {
        com.Model.Contact contact = (com.Model.Contact) mapObject;
        errorInfo.setErrorCode(contact.getErrorCode());
        errorInfo.setErrorDate(contact.getErrorDate());
    } else if (mapObject instanceof com.Model.Email) {
        com.Model.Email email = (com.Model.Email) mapObject;
        errorInfo.setErrorCode(email.getErrorCode());
        errorInfo.setErrorDate(email.getErrorDate());
    }
    return errorInfo;
}

调用时统一使用mapErrorInfo(trade)、mapErrorInfo(contact)、mapErrorInfo(email)即可。

方案2:反射实现(适合多类型扩展)

通过反射调用通用方法,避免重复编写分支判断,适合后续可能新增同结构外部类的场景:

import java.lang.reflect.Method;

private ErrorInfo mapErrorInfo(Object mapObject) {
    ErrorInfo errorInfo = new ErrorInfo();
    try {
        Method getErrorCodeMethod = mapObject.getClass().getMethod("getErrorCode");
        Method getErrorDateMethod = mapObject.getClass().getMethod("getErrorDate");
        
        // 注意根据实际返回类型强转,示例假设getErrorCode返回String、getErrorDate返回Date
        errorInfo.setErrorCode((String) getErrorCodeMethod.invoke(mapObject));
        errorInfo.setErrorDate((java.util.Date) getErrorDateMethod.invoke(mapObject));
    } catch (Exception e) {
        // 按需处理异常:日志记录、抛自定义异常等
        e.printStackTrace();
    }
    return errorInfo;
}

方案3:封装转换函数(Java 8+,优雅扩展)

将每种类型的转换逻辑封装为Function,通过Map维护类型与转换逻辑的映射,新增类型时仅需添加映射条目:

import java.util.Map;
import java.util.function.Function;

// 初始化类型-转换函数映射(可放在类初始化块或构造方法中)
private final Map<Class<?>, Function<Object, ErrorInfo>> converterMap = Map.of(
    com.Model.Trade.class, obj -> {
        com.Model.Trade trade = (com.Model.Trade) obj;
        ErrorInfo info = new ErrorInfo();
        info.setErrorCode(trade.getErrorCode());
        info.setErrorDate(trade.getErrorDate());
        return info;
    },
    com.Model.Contact.class, obj -> {
        com.Model.Contact contact = (com.Model.Contact) obj;
        ErrorInfo info = new ErrorInfo();
        info.setErrorCode(contact.getErrorCode());
        info.setErrorDate(contact.getErrorDate());
        return info;
    },
    com.Model.Email.class, obj -> {
        com.Model.Email email = (com.Model.Email) obj;
        ErrorInfo info = new ErrorInfo();
        info.setErrorCode(email.getErrorCode());
        info.setErrorDate(email.getErrorDate());
        return info;
    }
);

private ErrorInfo mapErrorInfo(Object mapObject) {
    Function<Object, ErrorInfo> converter = converterMap.get(mapObject.getClass());
    if (converter != null) {
        return converter.apply(mapObject);
    }
    // 处理未知类型:返回空对象或抛异常
    return new ErrorInfo();
}

内容的提问来源于stack exchange,提问作者Noorus Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:25:16