两个逻辑相同的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
相关产品推荐
相关产品推荐

