Java 令人困惑的三元声纳违规问题

Java Confusing Ternary Sonar Violation Issue

Sonar 报告了以下代码的混淆三元违规:

package com.example.dto;

import java.util.Date;

public class ShiftTemplateUserDTO {
  private Date breakStartTime;
  private Date breakEndTime;
  
  public Date getBreakStartTime() {
    return breakStartTime != null ? new Date(breakStartTime.getTime()) : null;
  }

  public void setBreakStartTime(Date breakStartTime) {
    this.breakStartTime = breakStartTime != null ? new Date(breakStartTime.getTime()) : null;
  }

  public Date getBreakEndTime() {
    return breakEndTime != null ? new Date(breakEndTime.getTime()) : null;
  }

  public void setBreakEndTime(Date breakEndTime) {
    this.breakEndTime = breakEndTime != null ? new Date(breakEndTime.getTime()) : null;
  }
}

我尝试更新代码以添加 if/else 条件,但 Sonar 仍然抱怨相同的规则,我做错了什么?

  public Date getBreakStartTime() {
    if (breakStartTime != null) {
      return new Date(breakStartTime.getTime());
    } else {
      return null;
    }
  }

  public void setBreakStartTime(Date breakStartTime) {
    if (breakStartTime != null) {
      this.breakStartTime = new Date(breakStartTime.getTime());
    } else {
      this.breakStartTime = null;
    }
  }

Sonar 不喜欢“不相等”的比较。它要你写 foo == null ? null : ....

不要在三元运算符中使用否定条件。 尝试替换这个:

return breakStartTime != null ? new Date(breakStartTime.getTime()) : null;

有了这个:

return breakStartTime == null ? null : new Date(breakStartTime.getTime());

这同样适用于您的 if-else 逻辑。 替换为:

if (breakStartTime != null) {
  return new Date(breakStartTime.getTime());
} else {
  return null;
}

有了这个:

if (breakStartTime == null) {
  return null;
} else {
  return new Date(breakStartTime.getTime());
}

您也可以考虑这样做而不是这样做:

public Date getBreakStartTime() {
    return breakStartTime != null ? new Date(breakStartTime.getTime()) : null;
}

你只需这样做:

public Date getBreakStartTime() {
    return breakStartTime;
}

在您当前的代码中,如果 Date 对象不为 null,则您正在构造一个新的 Date 对象,其时间值与原始 Date 值相同。这实际上导致了相同的对象。您可能担心不变性。这真的是你关心的问题吗?