如何以不发出声纳警告的方式将此代码块编辑为可读或逻辑。 我需要三个结果为false,true或null
public Boolean x() {
if (...) {
return true;
} else if (...) {
return false;
} else {
return null;
}
}
答案 0 :(得分:2)
尽管您可以返回null,但至少应根据squid:S2447
尽管
null
从技术上讲是一个有效的布尔值,但事实上,Boolean
和boolean
之间的区别很容易忘记。因此,从null
方法返回Boolean
可能会导致调用者代码出现问题。
如果您不同意,可以在本地禁用它:
return null;//NOSONAR
或完全在设置中停用此规则
也在sonar group中进行了讨论:
许多规则还批评了我个人认为不好的事情,即“不应从“布尔”方法返回null(squid:S2447)”。因此,我可能没有给出好的建议。
和Sonar community问题:
我建议对此有一个额外的规定。
因此不应该这样检查布尔值:
Boolean flag = service.getFlag(); // that's the unsafe call which could cause a null pointer exception if(flag) { // do something }
已回答:
不是引入新规则,而是使用S2447:不应该从防止方法返回布尔对象返回空值的“布尔”方法1中返回空值?
答案 1 :(得分:1)
从Java 8开始,使用Optional来编码TRUE,FALSE和Optional.empty。它遵循“避免返回null”模式,同时将禁止SonarQube警告。
代码应该是
public Optional<Boolean> x() {
if (...) {
return Optional.of(Boolean.TRUE);
}
else if (...) {
return Optional.of(Boolean.FALSE);
}
else {
return Optional.empty();
}
}
答案 2 :(得分:0)
此外,由于使用了Optional,我不必检查null控制。
例如:我的第一个代码块
public Boolean x() {
if (...) {
return true;
} else if (...) {
return false;
} else {
return null;
}
}
public void y() {
Boolean result = x();
if (result != null && result == true) {
System.out.println(true);
} else if (result != null && result == false) {
System.out.println("false");
} else {
System.out.println("null");
}
}
之后,使用可选的我的代码
public Optional<Boolean> x2() {
if (...) {
return Optional.of(Boolean.TRUE);
} else if (...) {
return Optional.of(Boolean.FALSE);
} else {
return Optional.empty();
}
}
public void y2() {
Optional<Boolean> result = x2();
if (result.equals(Optional.of(Boolean.TRUE))) {
System.out.println(true);
} else if (result.equals(Optional.of(Boolean.FALSE))) {
System.out.println("false");
} else {
System.out.println("null");
}
}
我删除了空控件