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

我的代码是:

private static final int BASE_ID = 100_000_000;
private boolean isValidId(Id id) {
    return id.asInteger().isPresent() && id.asInteger().get() >= BASE_ID;
}
asInteger方法返回Optional<Integer>
我从声纳古伯那里得到的错误是Call "Optional#isPresent()" before accessing the value.在返回线。

我了解该代码是可以的,因为如果第一个部分为false,则if的第二部分将不会执行。我知道可以使用.filter(..).isPresent()解决此问题,但我更喜欢这种方式。

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

最佳答案

Sonarqube无法保证对id.asInteger()的两次调用返回相同的对象,例如由于多线程可能已更改了两次调用之间的id的值,因此正确地指出存在性尚未得到充分测试。

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

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

10-07 22:36