斷言在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());
}
我找不到任何有關他們爲什麼的文檔nt有一個負面測試,而不是一個積極的測試 - 即最初的提議獲取了assertionsENABLED,現在我們使用assertionsDISABLED。 (可能!)生成更好的分支預測,但這似乎是一個非常蹩腳的猜測 - Java哲學(幾乎)總是使字節碼變得簡單,並讓JIT梳理優化。
(注意,這不是一個關於斷言是如何工作的問題 - !我知道:))
(順便說一句,這是相當有趣的是,這會導致不正確的教程6.2.1 of this tutorial! ,有人引用了a previous SO question on assertions的迴應得到了錯誤的測試意義!:)
任何想法?
確實。這使得使用$ assertionsDisabled更容易混淆決定;)另外(很明顯),這個變量在JITted代碼中總是不變的摺疊。 (通過-XX:+ PrintAssembly驗證) – lab27