你使用這個關鍵字還是拋出一些驗證運行時異常?它給你什麼好處?爲什麼你認爲它不值得使用?在java中聲明關鍵字
回答
如果條件爲false,則Assert將引發運行時錯誤(AssertionError)。斷言爲您提供了簡化的記錄,檢查和強制執行代碼正確性標準的方式。好處是用於定義和操縱這些正確性條件的語言級鉤子。如果希望啓用或禁用它們(有關這是否是個好主意的爭論),可以從JVM命令行執行。下面的一些評論者指出,除非在調試模式下運行,否則默認情況下禁用斷言;我的做法是在我的包裝腳本中隨時添加「-ea」(啓用斷言)。即使在性能敏感的代碼中,對我來說,權衡權重有利於從斷言中獲得的安全/正確性信心。 Assertions at Oracle和API Description for AssertionError
注預期或意外故障(例外),這可能是你的控制之外,並且斷言失敗之間的區別 - 斷言失敗文件程序員的假設,並指示不正確的程序,而不是一個意外的外部條件或預期特殊情況。 如果發生斷言失敗,則解釋是程序員誤解或錯誤地表達了程序,而不是其他錯誤或失敗來源。在實踐中,我用它來記錄我做出的明顯或非顯而易見的假設,以及在我產生(特別是私人/內部)代碼時要執行的不變量,使我和他人清楚地知道爲什麼會做出這些假設,它們在哪裏製作,以及它們是否經過驗證。比同樣效果的評論好得多。這是向Design by Contract邁出的一小步。
有效Java項目#38「檢查參數的有效性」(Google Books,Amazon.com)提供了參數檢查與正確使用斷言之間區別的有用表述。
相關於SO:(Enabling assertions in netbeans),(Assertions vs. Exceptions),(Near duplicate, asking for examples),(Badly named, but very similar content)
andersoj是正確的。只是爲了讓你知道,斷言的好處是你可以簡單地關閉它(如果你不在java命令行中傳遞-ea)。這個簡單的事情使他們完美的用於開發,當你想確保你沒有破壞自己的代碼。
您可以在開發過程中使用它來啓用某些功能,然後在活動網站上將其完全禁用。例如
...
assert debug("xxx");
...
static boolean debug(String format, Object... args){ print(...); return true; }
調試語句將在活動站點上增加零開銷。
你認爲這是一個好習慣嗎?我認爲最好使用一些Logger.debug()方法或類似的東西。 – 2010-09-27 18:55:47
我認爲最常見的做法是擺脫這種事情,避免潛在的複雜方法調用。特別是如果有一些潛在的副作用(我會計算輸出到stdout作爲「副作用」)。 – andersoj 2010-09-27 20:04:55
準確地對您的問題:
Assert用於驗證語句的條件。
assert (some condition)
Example : assert (6 < 7) // condition pass
assert (6 > 7) // throws AssertionException here
大多數人使用斷言以下用例字符串:(但我個人不喜歡用斷言它):
assert (obj != null || obj.isEmpty() || ...)
我比較喜歡使用谷歌番石榴是乾淨和服務目的:
Obj.isNullOrEmpty()
更多信息:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Strings.html
它給你帶來了什麼好處?爲什麼你認爲它不值得使用?
將斷言用於強制檢查,正如其他人建議的是危險練習。
當其他開發人員使用您的庫時會發生什麼?或者系統管理員或高級用戶忘記,或者更糟糕的是,在運行時使用-ea標誌來啓用斷言?你失去了所有這些檢查,就是這樣。
斷言是一種開發工具。該標誌的默認狀態是off的事實是一個死衚衕。
應用程序中的任何功能或優點都不應依賴於斷言。
作爲背景,assert在C/C++中的使用方式與從中提取功能的方式相同。在C/C++中,開發人員通常可以在編譯時通過#define DEBUG ...
來啓用或禁用聲明。隨着C/C++生產代碼通常關閉此功能。
從概念上講,Java應該也是如此。在生產使用條件和例外。他們本質上是一回事。
- 1. 類聲明中的關鍵字const
- 2. 在類和實例聲明中鍵入關鍵字
- 3. 聲明列表場final關鍵字
- 4. 沒有var關鍵字聲明變量
- 5. 在餅乾字典中爲關鍵字聲明值
- 6. 函數聲明__constructor中沒有關鍵字public在PHP中
- 7. 「where」關鍵字在c sharp中的類聲明中
- 8. 在Java中,爲什麼要聲明關鍵字而不是方法?
- 9. 聲明在Java中
- 10. 聲明在java中
- 11. 在TypeScript中聲明關鍵字的用途
- 12. 無法聲明在arraylist中的關鍵字
- 13. 硒 - 聲明列表中存在多個關鍵字的數組
- 14. 虛擬關鍵字在函數聲明中的位置
- 15. 在c#屬性聲明中的「新」關鍵字
- 16. 可以在定義和聲明中指定extern關鍵字
- 17. 類聲明中的關鍵字「where」在做什麼?
- 18. 用「class」關鍵字聲明一個變量vs在函數聲明中聲明一個沒有「class」關鍵字的變量
- 19. 方法聲明中的參數聲明之前的最後一個關鍵字
- 20. throw關鍵字在Java中
- 21. C++中成員函數聲明中volatile關鍵字的位置
- 22. 關於關鍵字, 「新」 在Java中
- 23. sql plus中聲明變量關鍵字的變量(oracle 9i)?
- 24. Alloy中「private」關鍵字的含義? '枚舉'聲明的含義?
- 25. 函數聲明中模板關鍵字的含義
- 26. Xcode聲明「this」是C中的保留語言關鍵字?
- 27. 函數聲明的返回類型中的const關鍵字
- 28. 使用別名關鍵字來聲明在VBA
- 29. 在Java中聲明集合
- 30. 在Java中聲明'long'over'int'
想補充說,斷言在運行時默認是禁用的。有命令行開關(-enableassertions或-ea)可用於選擇性地啓用斷言。 – 2010-09-27 17:31:13
我認爲你的意思是「在非調試代碼中禁用」而不是「在運行時禁用」。 – DJClayworth 2010-09-27 17:36:11
使用Netbeans,我該如何堅持-ea? – Pete 2010-09-27 20:54:56