如何合并仅第二个参数不同的两个Java方法 消除代码重复
Java 重复方法去重合并方案
核心思路
两个方法的核心逻辑完全一致,仅入参的类型标识不同,利用Jackson的JavaType作为中间统一类型,抽取公共逻辑到私有方法即可,同时优化ObjectMapper的创建逻辑避免重复实例化。
最终实现代码
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; @Slf4j public class JsonUtil { // ObjectMapper线程安全,全局实例化一次即可,避免每次调用重复创建 private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper() .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // 原Class入参方法,可保留原有方法名无需修改调用逻辑 public static <T> T mapResponseBody(ApiException e, Class<T> type) { return readJsonValue(e.getResponseBody(), OBJECT_MAPPER.constructType(type)); } // 原TypeReference入参方法,支持重载统一方法名,也可保留原mapResponseBodyArray名称 public static <T> T mapResponseBody(ApiException e, TypeReference<T> type) { return readJsonValue(e.getResponseBody(), OBJECT_MAPPER.constructType(type)); } // 抽取的公共私有方法,所有重复逻辑收敛到此处 private static <T> T readJsonValue(String jsonStr, JavaType javaType) { T result = null; try { result = OBJECT_MAPPER.readValue(jsonStr, javaType); } catch (IOException ioException) { log.error("Json Mapper Error", ioException); } return result; } }
方案说明
- 对外保留两个方法入口,兼容原有所有调用逻辑,无需修改业务侧代码
- 所有公共逻辑仅在私有方法中保留一份,后续修改配置、异常处理逻辑只需修改一处
- 优化了ObjectMapper的创建逻辑,避免反复生成实例带来的性能损耗
- 如果不需要重载方法名,可保留原有
mapResponseBodyArray方法名,内部同样调用公共readJsonValue方法即可
内容的提问来源于stack exchange,提问作者Toni26
相关产品推荐
相关产品推荐

