java 中的断言编译为添加到测试中的私有合成静态布尔值 - 该提案在此处得到了很好的记录:
在其中,我们创建
最终私有静态布尔$assertionsEnabled = ClassLoader.desiredAssertionStatus(className);
接着
断言(X)变成
if ($assertionsEnabled && !x) { 抛出 }
这很有意义;)
但是,我注意到我实际得到的是
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());
}
我找不到任何文档说明他们为什么使用 NEGATIVE 测试而不是肯定测试 - 即原始提案捕获了 assertionsENABLED,现在我们使用 assertionsDISABLED。
我唯一能想到的是,这可能(可能!)生成更好的分支预测,但这对我来说似乎是一个非常蹩脚的猜测——Java 哲学(几乎)总是使字节码简单,并让 JIT整理优化。
(请注意,这不是关于断言如何工作的问题 - 我知道!:))
(顺便说一句,这会导致教程不正确,这很有趣!本教程的6.2.16.2.1 ,有人在回答之前关于断言的 SO 问题时引用了该内容,因此测试错误!:)
有任何想法吗?