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

如何复用参数类型不同的方法避免代码重复触发Sonar告警

解决方案

提供两种落地性强的方案,可根据你的项目实际约束选择:

方案1:抽取公共接口(侵入小、性能最优,推荐优先使用)

两个入参类Event和EventTable的方法签名完全一致,只需先抽公共接口统一行为:

  1. 定义公共父接口
public interface EventBase {
    // 三个方法和现有两个实体类的实现完全对齐,直接声明即可
    EventStatus getEventStatus();
    List<EventStatusLog> getEventStatusLog();
    // 此处Log替换为你项目中getLogs返回的实际类名
    List<Log> getLogs();
}
  1. 让Event和EventTable实现该接口,因为两个类本身已经有这三个方法的实现,仅需加implements EventBase声明即可,无需修改原有逻辑。
  2. 把重复的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();
}
  1. 删掉两个Mapper中原有重复的私有方法,直接调用抽取后的公共方法即可。

方案2:函数式参数适配(无需修改实体类,适合实体类不可改的场景)

如果Event和EventTable是自动生成的代码、不允许修改类定义,可以用函数式接口把属性获取逻辑抽成参数,避免修改实体类:

  1. 在公共工具类中编写泛型通用方法:
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();
    }
}
  1. 两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:54:08