如何复用参数类型不同的方法避免代码重复触发Sonar告警
解决方案
提供两种落地性强的方案,可根据你的项目实际约束选择:
方案1:抽取公共接口(侵入小、性能最优,推荐优先使用)
两个入参类Event和EventTable的方法签名完全一致,只需先抽公共接口统一行为:
- 定义公共父接口
public interface EventBase { // 三个方法和现有两个实体类的实现完全对齐,直接声明即可 EventStatus getEventStatus(); List<EventStatusLog> getEventStatusLog(); // 此处Log替换为你项目中getLogs返回的实际类名 List<Log> getLogs(); }
- 让
Event和EventTable实现该接口,因为两个类本身已经有这三个方法的实现,仅需加implements EventBase声明即可,无需修改原有逻辑。 - 把重复的
getDoneDate逻辑抽到公共位置,比如两个Mapper的公共父类,或者单独的业务工具类:
// 示例:抽到公共Mapper父类 protected Optional<Date> getDoneDate(EventBase event) { var eventStatus = event.getEventStatus(); if(eventStatus.getName().equals(EventState.DONE.getName())) { List<EventStatusLog> eventStatusLogs = event.getEventStatusLog(); if(eventStatusLogs.isEmpty()) { return Optional.of(Iterables.getLast(event.getLogs()).getDate()); } return Optional.of(Iterables.getLast(eventStatusLogs).getModified()); } return Optional.empty(); }
- 删掉两个Mapper中原有重复的私有方法,直接调用抽取后的公共方法即可。
方案2:函数式参数适配(无需修改实体类,适合实体类不可改的场景)
如果Event和EventTable是自动生成的代码、不允许修改类定义,可以用函数式接口把属性获取逻辑抽成参数,避免修改实体类:
- 在公共工具类中编写泛型通用方法:
public class EventUtils { public static <T> Optional<Date> getDoneDate(T event, Function<T, EventStatus> statusGetter, Function<T, List<EventStatusLog>> statusLogGetter, Function<T, List<? extends Log>> logGetter) { var eventStatus = statusGetter.apply(event); if(eventStatus.getName().equals(EventState.DONE.getName())) { List<EventStatusLog> eventStatusLogs = statusLogGetter.apply(event); if(eventStatusLogs.isEmpty()) { return Optional.of(Iterables.getLast(logGetter.apply(event)).getDate()); } return Optional.of(Iterables.getLast(eventStatusLogs).getModified()); } return Optional.empty(); } }
- 两个Mapper中直接调用工具类方法,传入对应属性的方法引用即可:
- EventBasicMapper中调用示例:
Optional<Date> doneDateOpt = EventUtils.getDoneDate(event, EventTable::getEventStatus, EventTable::getEventStatusLog, EventTable::getLogs);- EventMapper中调用示例:
Optional<Date> doneDateOpt = EventUtils.getDoneDate(event, Event::getEventStatus, Event::getEventStatusLog, Event::getLogs);
两种方案均可完全消除重复代码,解决Sonar重复告警。
内容的提问来源于stack exchange,提问作者user16807416
相关产品推荐
相关产品推荐

