Pab*_*mez 12 java optional java-8 sonarqube sonarqube-scan
我运行SonarQube检查我的代码,我发现了一个我不理解报告错误的案例.
我的代码是:
private static final int BASE_ID = 100_000_000;
private boolean isValidId(Id id) {
return id.asInteger().isPresent() && id.asInteger().get() >= BASE_ID;
}
Run Code Online (Sandbox Code Playgroud)
该方法asInteger返回Optional<Integer>
我从sonarqube得到的错误是
Call "Optional#isPresent()" before accessing the value.
在返回行.
我理解代码是正常的,因为如果第一个是假的,那么if的第二部分将被执行.我知道这可以通过a来解决,if但我更喜欢这种方式.
有什么想法会发生这种情况吗?
And*_*eas 15
Sonarqube不能保证两个调用id.asInteger()返回相同的对象,例如因为多线程可能已经改变id了两个调用之间的值,所以它正确地说明存在没有被充分测试.
首先更改代码以分配给局部变量,以确保在同一对象上调用isPresent()和get()调用:
private boolean isValidId(Id id) {
Optional<Integer> idAsInteger = id.asInteger();
return idAsInteger.isPresent() && idAsInteger.get() >= BASE_ID;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您可以将其写为单个语句:
return id.asInteger()
.map(x -> x >= BASE_ID)
.orElse(false)
Run Code Online (Sandbox Code Playgroud)
但声纳抱怨是因为在这种情况下这是一个误报。