如何编写通用可复用代码?外部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
相关产品推荐
相关产品推荐

