Java 断言 - $assertionsDisabled 与 $assertionsEnabled
java中的断言编译为添加到测试中的私有合成静态布尔值 - 该提案在这里有很好的记录:
在其中,我们创造
final private static boolean $assertionsEnabled = ClassLoader.desiredAssertionStatus(className);
然后
assert(X)成为
if ($assertionsEnabled && !x) { throw }
这完全有道理;)
但是,我注意到我实际得到的是
public void test1(String s) {
assert (!s.equals("Fred"));
System.out.println(s);
}
成为
static final /* synthetic */ boolean $assertionsDisabled;
public void test1(String s) {
if ((!(AssertTest.$assertionsDisabled)) && (s.equals("Fred"))) {
throw new AssertionError();
}
System.out.println(s);
}
static {
AssertTest.$assertionsDisabled = !(AssertTest.class.desiredAssertionStatus());
}
我找不到任何关于为什么他们使用阴性测试而不是阳性测试的文档 - 即原始提案捕获的断言ENABLED,现在我们使用断言DISABLED。
我唯一能想到的是,这可能会(可能!)产生更好的分支预测,但这对我来说似乎是一个非常蹩脚的猜测 - Java的理念是(几乎)总是使字节码变得简单,并让JIT整理出优化。
(请注意,这不是关于断言如何工作的问题 - 我知道!:))
(顺便说一句,有趣的是,这会导致不正确的教程!本教程的6.2.1,有人在回答之前关于断言的SO问题时引用了它,使测试感觉错误!:)
有什么想法吗?