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

两个逻辑相同的Java方法如何封装为通用泛型方法实现代码复用?

Java泛型封装重复逻辑方案

核心思路:抽象两个Staging类的公共行为,再通过泛型约束入参类型即可完成通用方法封装,无需重复编写逻辑。

步骤1:定义公共行为接口

两个Staging类(UnoBorrowerStaging、UnoDocumentsStaging)都包含相同的setter方法,先抽象公共接口:

public interface BaseStaging {
    void setIs_processed(Integer status);
    void setRemarks(String remarks);
    void setPayload(String payload);
    void setCreatedBy(String createdBy);
}

让两个Staging类实现该接口即可,原有代码无需其他修改:

public class UnoBorrowerStaging implements BaseStaging {
    // 原有属性、方法保持不变
}

public class UnoDocumentsStaging implements BaseStaging {
    // 原有属性、方法保持不变
}

步骤2:编写通用泛型方法

优化提示:ObjectMapper是线程安全的,建议抽为类的全局常量,避免反复创建造成性能损耗

// 泛型说明
// ST:Staging对象类型,必须实现BaseStaging接口
// R:仓库类类型,继承Spring Data的CrudRepository即可
// T:待序列化为JSON的对象类型,无额外约束
private <ST extends BaseStaging, R extends org.springframework.data.repository.CrudRepository<ST, ?>, T> 
void saveStagingData(Principal principal, ST staging, Integer status, String remarks, R repo, T dataToSerialize) {
    ObjectMapper objectMapper = new ObjectMapper();
    String payload = null;
    try {
        payload = objectMapper.writeValueAsString(dataToSerialize);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
        // 可根据业务需要调整异常处理逻辑,比如抛出业务异常、打印错误日志
    }
    staging.setIs_processed(status);
    staging.setRemarks(remarks);
    staging.setPayload(payload);
    staging.setCreatedBy(principal.getName());
    repo.save(staging);
}

步骤3:调用示例

原有重复方法可直接删除,业务逻辑处直接调用通用方法即可:

// 原extracted方法逻辑替换
saveStagingData(principal, unoBorrowerStaging, status, remarks, unoBorrowerStagingRepo, unoBorrowerDetails);

// 原extracted2方法逻辑替换
saveStagingData(principal, unoDocumentsStaging, status, remarks, unoDocumentsStagingRepo, unoDocumentsEntity);

可选非侵入式方案(无需修改原有Staging类)

如果不想修改原有Staging类实现接口,可以通过函数式接口传递set和save逻辑:

private <ST, T> void saveStagingData(Principal principal, ST staging, Integer status, String remarks,
                                     Consumer<ST> saveAction, T dataToSerialize,
                                     BiConsumer<ST, Integer> setStatus, BiConsumer<ST, String> setRemarks,
                                     BiConsumer<ST, String> setPayload, BiConsumer<ST, String> setCreatedBy) {
    ObjectMapper objectMapper = new ObjectMapper();
    String payload = null;
    try {
        payload = objectMapper.writeValueAsString(dataToSerialize);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    setStatus.accept(staging, status);
    setRemarks.accept(staging, remarks);
    setPayload.accept(staging, payload);
    setCreatedBy.accept(staging, principal.getName());
    saveAction.accept(staging);
}

调用示例:

// UnoBorrowerStaging调用
saveStagingData(principal, unoBorrowerStaging, status, remarks, unoBorrowerStagingRepo::save, unoBorrowerDetails,
    UnoBorrowerStaging::setIs_processed, UnoBorrowerStaging::setRemarks, 
    UnoBorrowerStaging::setPayload, UnoBorrowerStaging::setCreatedBy);

// UnoDocumentsStaging调用
saveStagingData(principal, unoDocumentsStaging, status, remarks, unoDocumentsStagingRepo::save, unoDocumentsEntity,
    UnoDocumentsStaging::setIs_processed, UnoDocumentsStaging::setRemarks, 
    UnoDocumentsStaging::setPayload, UnoDocumentsStaging::setCreatedBy);

内容的提问来源于stack exchange,提问作者NIRMALYA ROY KARMAKAR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:18:01