真正的Assert語句有什麼好處。我不明白爲什麼我需要使用它。我讀了近100條有關斷言陳述的問題/答案,但仍然不知道它有什麼好處。我認爲這個陳述有太多的衝突。Assert語句有什麼好處?
例如有人說:「不要在生產中使用它」,但有些人說「你可以在生產層面使用它們」。有些人說:「總是處理生產中的斷言錯誤」,但有些人說「從不處理生產或開發級別的斷言錯誤」。
這是爲什麼呢例如https://stackoverflow.com/a/2758262/1379734
真正的Assert語句有什麼好處。我不明白爲什麼我需要使用它。我讀了近100條有關斷言陳述的問題/答案,但仍然不知道它有什麼好處。我認爲這個陳述有太多的衝突。Assert語句有什麼好處?
例如有人說:「不要在生產中使用它」,但有些人說「你可以在生產層面使用它們」。有些人說:「總是處理生產中的斷言錯誤」,但有些人說「從不處理生產或開發級別的斷言錯誤」。
這是爲什麼呢例如https://stackoverflow.com/a/2758262/1379734
爲什麼這會被認爲是不正確的?
public int pop() {
// precondition
assert !isEmpty() : "Stack is empty";
return stack[--num];
}
的assert
是應該表達不變的條件。如果pop()
是一個private
方法,那麼您可能會認爲它應該只有纔會被檢查空堆棧的代碼調用。由於此方法爲public
,因此您無法控制調用方可以執行哪些假設。在這種情況下,堆棧下溢應導致Exception
。
再次,assert
是東西宣告必須是真實的,不是一件可能是真實的。 「可能」條件應通過其他運行時檢查強制執行,而不是在聲明中聲明。
是否啓用生產聲明受制於偏好。這樣做的理由是斷言不應該失敗,所以它們應該在生產中安全。反對這樣做的論點是表現懲罰(某些assert
條件的計算可能很昂貴),以及投擲Error
throwables的破壞性質。
的不正確使用你似乎是尋找簡單,它始終是一個好主意,或者它從來就不是一個好主意。不是這種情況。它有適用的情況下,它是有道理的,在有限的情況下,你想避免它們的性能,但這是非常罕見的。
有些人對你的斷言不瞭解甚多,但很樂意發表意見。我建議你得出你自己的結論,並在適合你的地方使用它。
的錯誤和異常的問題,我建議只處理這些地方
因此,我陷入Throwable在我的線程的最高級別(就在它死亡之前),並確保它被正確記錄。在所有其他情況下,我只會捕捉例外,我可以做一些有用的事情。
聲明需要開銷來處理。理論上講,如果他們通過測試,沒有理由在生產中重新運行它們。你的測試可能是不完整的,並且一個斷言可能會遇到一個在測試期間沒有解決的意外情況,但是希望日誌能夠讓你找出錯誤,而不需要運行斷言。
你的問題是一個意見問題;我認爲這是題外話。 –
可能重複的[在Java斷言?](http://stackoverflow.com/questions/2758224/assertion-in-java) –
你所看到的稱爲**「意見分歧」**。你需要閱讀這些論點並且自己決定哪一個你同意。再次重申意見不會有成果。 –