SonarLint告诉我:
"Refactor this code to not always return the same value."
但我似乎不明白为什么
private List<InvoiceRejectionMessage> invoiceList = new ArrayList<>();
public String getMessage() {
if(!invoiceList.isEmpty()) {
return invoiceList
.stream()
.max(comparing(InvoiceRejectionMessage::getCreatedAt))
.get()
.getMessage();
}
return null;
}
InvoiceList已定义并将始终初始化,因此它不能为空。如果它为空,则返回null。如果不是,我们确定那里有一个元素,可以通过.max()和.get()返回
由于Sonarlint告诉我,我觉得为什么我会收到这个警告,所以我觉得不能轻松地重构这种方法
答案 0 :(得分:3)
与此提示相关联的规则是
squid:S3516 - 方法返回不应该是不变的
此规则的SonarQube实施可在GitHub上找到。
如果没有看到整个代码,我不能100%确定为什么会触发此规则。但是,我怀疑Sonar能够弄清楚
invoiceList
无条件地为空;因此if
分支永远不会被执行;因此,the getMessage
方法无条件地返回null
。无论如何,没有必要将空列表视为特例;您可以通过以下方式简化代码,这可能会使Sonar安抚:
private List<InvoiceRejectionMessage> invoiceList = new ArrayList<>();
public String getMessage() {
return invoiceList
.stream()
.max(comparing(InvoiceRejectionMessage::getCreatedAt))
.map(InvoiceRejectionMessage::getMessage)
.orElse(null);
}
顺便提一下,如果您可以更改该类的API,其客户端可以从将getMessage
的返回类型更改为Optional<String>
中受益(只需删除最后一个orElse(null)
呼叫):
public Optional<String> getMessage() {
return invoiceList
.stream()
.max(comparing(InvoiceRejectionMessage::getCreatedAt))
.map(InvoiceRejectionMessage::getMessage)
}