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

如何合并仅第二个参数不同的两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:24:04