SonarLint警告,此代码将始终返回相同的值

时间:2018-04-12 08:25:35

标签: java-8 optional sonarlint

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告诉我,我觉得为什么我会收到这个警告,所以我觉得不能轻松地重构这种方法

1 个答案:

答案 0 :(得分:3)

与此提示相关联的规则是

  

squid:S3516 - 方法返回不应该是不变的

此规则的SonarQube实施可在GitHub上找到。

如果没有看到整个代码,我不能100%确定为什么会触发此规则。但是,我怀疑Sonar能够弄清楚

  1. invoiceList无条件地为空;因此
  2. if-then-else语句的if分支永远不会被执行;因此,
  3. the getMessage方法无条件地返回null
  4. 无论如何,没有必要将空列表视为特例;您可以通过以下方式简化代码,这可能会使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)
    }