l Assertions:
意義
l 驗證一個class的method是否被正確的呼叫。
l 進階的exception handling,只可丟出AsserttionError。
注意
l assert statement如果放在”unreachable”的地方,compiler時會產生error。
l 預設compiler time與run time是不支援assertion statement。
l 程式中如果有使用assert,在complier時就一定要加上-source 1.4的選項,否則會compiler error。
宣告方式
assert expression1;
expression1需為boolean type,否則會compile error。意思為當程式執行到此,expression1的結果一定為真,若為假則丟出一個沒有任何error msg的AsserttionError。
assert expression1 : expression2;
expression1需為boolean type,且expression2的求值結果不可為void,否則會compile error。意思為若exp1的結果為假,則丟出由exp2所提供的error msg的AsserttionError。
使用方式
l run time時要enable或disable assertion checking時:
要enable時
要disable時
system classes
-esa / -enablesystemassertions
non-system classes
-ea / -enableassertions
-da / -disableassertions
l Assertions can be selectively enabled for...
named class
won’t automatically enabled for any subclass of the named class
named package
will automatically enabled for the subpackages
unnamed package
in the current working directory
won’t enabled if in any named directory
使用時機
適合使用
檢定private methods的precondition,確保在進行某些操作前已滿足先決條件。(輸入的月份需>=1且<=12才進行該月有幾天的計算)
檢定所有methods的postcondition,確保某些操作後,即定條件仍滿足。(計算的天數結果需>=28且<=31才將天數ruturn回去)
檢定class invariant。確保在任何情況下,某個不變的狀態必須滿足。class invariant必須在這個class的每個public methods及constructors結束之前做才可確保不變狀態。
在switch case statement中如果需在每個case做return,則在default使用”throw new AssertionError()”比使用assert statement更來得恰當(因無論有無加-source 1.4都不會error)
不要使用
public methods的arguments checking,因為argument checking是永遠要做的,而assertions卻不一定永遠會被執行。
Assertion statements不可有任何副作用。因為assertion可能被disabled,所以不要用assertion statement去改變instance var的值或影響method的ruturn value。
总结自:【 Garfield 的 SCJP 閱讀筆記 】