我在解決問題的同時,最近在Java中發現了assert
關鍵字。起初,我很興奮。一些有用的東西,我不知道!一種更有效的方式來檢查輸入參數的有效性!耶學習!Java斷言是否被破壞?
但後來我拿了仔細一看,和「鍛鍊」爲「扼殺出完全」由一個簡單的事實,我的熱情就沒有那麼多:你可以把斷言關閉*
這聽起來就像一場噩夢。如果我聲稱如果輸入listOfStuff
爲null
,我不希望代碼繼續運行,那麼爲什麼我會希望該斷言被忽略?這聽起來像是如果我正在調試一段產品代碼,並懷疑listOfStuff
可能錯誤地通過了null
,但沒有看到任何日誌文件證據表明該斷言被觸發,我不能相信listOfStuff
實際上發送了一個有效的值;我還必須說明斷言可能完全被關閉的可能性。
這個假設我是一個調試代碼的人。有些不熟悉斷言的人可能會看到並假設(相當合理),如果斷言消息沒有出現在日誌中,listOfStuff
就不成問題。如果你的第一次遇到assert
是瘋狂的,你會發現它可能完全被關閉嗎?畢竟,這不像是有一個命令行選項可以讓你禁用try/catch塊。
所有這一切使我對我的問題(這是一個問題,而不是誇誇其談的藉口我保證!):
我缺少什麼?
是否有一些細微差異讓Java的實現assert
遠比我給它的功用更有用?在某些情況下,從命令行啓用/禁用它的能力實際上是非常有價值的嗎?當我設想在生產代碼中使用它代替if (listOfStuff == null) barf();
等語句時,我是否會誤解它?
我只是覺得這裏有一些重要的東西,我沒有得到。
*好的,從技術上講,它們實際上是默認關閉的;你必須竭盡全力打開它們。但是,仍然可以完全敲除它們。
編輯:啓示要求,啓發收到。
assert
首先是一個調試工具,這個概念對我來說意義重大。
我仍然認爲應該在生產環境中禁用非平凡私有方法的輸入檢查,因爲開發人員認爲不好的輸入是不可能的。根據我的經驗,成熟的生產代碼是一個瘋狂的,龐大的事物,多年來由具有不同程度技能的人開發,針對不同程度的理智的快速變化的要求。即使不好的投入是不可能的,從現在開始六個月的一段草率維護編碼可以改變這種狀況。 The link gustafc provided(!感謝)包括本爲例:
assert interval > 0 && interval <= 1000/MAX_REFRESH_RATE : interval;
禁止生產這種簡單的檢查,在我看來是愚蠢樂觀。但是,這是編碼哲學的一個區別,而不是一個破碎的特徵。
另外,我可以肯定看到的是這樣的值:
assert reallyExpensiveSanityCheck(someObject) : someObject;
我要感謝大家誰花時間幫我明白這個功能;這是非常讚賞。
這看起來很像一個咆哮,而不是一個問題。 – 2010-05-03 15:39:29
你曾經在C或C++中使用過ASSERT嗎?你有沒有希望你可以打開或關閉他們的手指? – 2010-05-03 15:46:51
@Joachim:我明白了,但是很認真,我在這裏尋找啓示。這個功能對我來說確實確實有些破裂 - 但這種感覺完全等同於說「我的代碼沒有看到什麼問題,因此編譯器必須被破壞!」,只是在更高的層面上。我真的覺得我錯過了一些東西。如果你能爲我提供一種方式來表達,爲什麼這個功能讓我覺得不如破碎,這不會引起你的咆哮,我正在傾聽。 – BlairHippo 2010-05-03 15:47:14