Java のアサーションは、テストに追加されたプライベートな合成静的ブール値にコンパイルされます - 提案はここにうまく文書化されています:
その中で、私たちは作成します
final private static boolean $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());
}
なぜ彼らが肯定的なテストではなく、否定的なテストを行ったのかについての文書を見つけることができません。
私が考えることができる唯一のことは、これがおそらく(おそらく!)より良い分岐予測を生成するということですが、それは私にはかなり不十分な推測のようです.最適化を整理します。
(これはアサーションがどのように機能するかについての質問ではないことに注意してください - 私はそれを知っています! :) )
(余談ですが、これが誤ったチュートリアルにつながることは非常に興味深いことです!このチュートリアルの 6.2.1 は、アサーションに関する以前の SO の質問に応答して誰かが引用したもので、テストの意味が間違っています! :)
何か案は?