我正在使用 Java 8 试用Checker Framework的 Nullness 检查器。当我在以下代码上运行检查器时:
import java.util.HashMap;
import java.util.Map;
import org.checkerframework.checker.nullness.qual.Nullable;
class A {
public void f() {}
}
public class Foo {
private Map<A,Integer> map = new HashMap<>();
private @Nullable A x;
public void setX(@Nullable A x) {
this.x = x;
}
public void call() {
if (x != null) {
map.put(x, 0);
x.f();
}
}
}
x.f();
检查器对可能的空引用 x的取消引用发出警告。当然,这是有道理的。Checker Framework 不知道做什么map.put
。map 对象可能已经引用了this
,然后调用setX(null)
它。
现在我的问题如下。有什么方法可以告诉 Checker Framework 一个方法不会修改除了它被调用的对象之外的任何对象?因为map.put
不调用setX
方法,所以 的值x
不会改变。
为了摆脱警告,我可以将调用方法更改为:
public void call() {
A y = x;
if (y != null) {
map.put(y, 0);
y.f();
}
}
现在没有任何警告。这也是有道理的:不能从外部访问局部变量。但我不喜欢仅仅为了消除警告而引入这个局部变量。
或者,我可以x
通过@MonotonicNonNull
. 但在我的实际用例中,我想保留将字段设置为空的可能性。
提前致谢!