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 值相同。这实际上导致了相同的对象。您可能担心不变性。这真的是你关心的问题吗?
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 值相同。这实际上导致了相同的对象。您可能担心不变性。这真的是你关心的问题吗?