在单行中调用 Optional#isPresent() 被报告为未调用

我运行SonarQube来检查我的代码,我发现了一个我不理解报告的错误的情况。

我的代码是:

private static final int BASE_ID = 100_000_000;
private boolean isValidId(Id id) {
    return id.asInteger().isPresent() && id.asInteger().get() >= BASE_ID;
}

该方法返回asIntegerOptional<Integer>

我从声纳库贝得到的错误是在返回行中。Call "Optional#isPresent()" before accessing the value.

我知道代码是可以的,因为如果第一部分是假的,则第二部分将不会执行。我知道这可以用a来解决,但我更喜欢这样。if.filter(..).isPresent()

任何想法为什么会发生这种情况?


答案 1

Sonarqube 不能保证两个调用返回相同的对象,例如,因为多线程可能更改了两个调用之间的值,因此它正确地指出存在尚未经过充分测试。id.asInteger()id

更改代码以首先分配给局部变量,以确保 和 在同一对象上被调用:isPresent()get()

private boolean isValidId(Id id) {
    Optional<Integer> idAsInteger = id.asInteger();
    return idAsInteger.isPresent() && idAsInteger.get() >= BASE_ID;
}

答案 2

顺便说一句,你可以把它写成一个语句:

return id.asInteger()
         .map(x -> x >= BASE_ID)
         .orElse(false)

但是声纳抱怨是因为在这种情况下,这是一个误报。


推荐