撰寫方法時容易忽略”非正常流程”的處理,特別是在趕工的時候。
對於檢查方法參數的有效性也有一套準則,從 Effective Java 整理出來。
Rule:
1.對於方法或是建構式的參數限制應該寫在註解中,並在方法的開頭檢查參數。
2.public 方法或是建構式可以使用 throw new xxxException 並在方法宣告加上註解@throws 說明違反參數規則會出現的異常。
3.private 方法可以使用 assert 斷言來限制, assert 必須開啟才有效。
(For eclipse → right click class in package explorer → run as → run configuration → arguments → VM arguments → type -ea)
4.不需要作檢查的情況為檢查成本太大,或是檢查會隱含在計算過程中(即使做了檢查也沒多大意義)。
jdk 中 File 類別的建構式,第7行檢查參數的有效性不可為null。
/** ... * @throws NullPointerException * If the pathname argument is null */ public File(String pathname) { if (pathname == null) { throw new NullPointerException(); } this.path = fs.normalize(pathname); this.prefixLength = fs.prefixLength(this.path); }
另一個私有建構式也做了參數的檢查(第7,8行)
/** * Internal constructor for already-normalized pathname strings. * The parameter order is used to disambiguate this method from the * public(File, String) constructor. */ private File(String child, File parent) { assert parent.path != null; assert (!parent.path.equals("")); this.path = fs.resolve(parent.path, child); this.prefixLength = parent.prefixLength; }
至於第4點的後段”檢查會隱含在計算過程中” e.g.
private File createFile(String filePath) { assert filePath != null; File result = new File(filePath); return result; }
第3行使用了 assert 來檢查傳入的參數是否為 null , 其實就是不需要的檢查。若是傳入 null,在第4行會丟出NullPointerException,
而不需要在方法開頭檢查。