網頁

2009年12月20日 星期日

Java Assertion

Assertion 是 Java 1.4 後才有的一個新特色,作用是幫助 debug。

例如在以下的程式中,num 的值應該要大於 0,則你可以使用 Assertion 來幫助你確認。

private void methodA(int num) {
    assert(num>0);
    useNum(num+x);
}

簡單的說,當 assert 後方的引數為 false 時,則程式就會丟出 AssertionError。

另一種用法是提供一些訊息給 Assertion,當出現 AssertionError 時,
這些訊息就會顯示在 Stack Trace 上。

例: assert(num>0):"num must greater than 0";
冒號後方的引數可為 primitive 或 Object。


Asertion 預設是不啟用,若是要啟用 Assertion 的功能,
在編譯時必須使用 "javac -source 1.4"。
(預設是 "javac -source 1.3")

目前在 6.0 版 Compile 時,已經不需要增加額外的參數了。

而在執行時則用 "java -ea" 或著 "java -enableassertions",
同樣的預設值也是不啟用。

如果只須啟用部分 class 或著部分 package 的 Assertions 功能,
可以用這樣的方式 "java -ea:com.foo.Bar",
或著只有某 package 不啟用 "java -ea -da:com.foo",
(-da 為 -disableassertions 的縮寫)
另外還有兩個參數為 "-dsa" 和 "-esa",
分別代表 "disable systema ssertion" 和 "enable systema ssertion"。

[註] Java 中的 package 並無階層的關係,
例如 com.foo 以及 com.foo.xxx,其中並沒有任何的關係,
它們只是在檔案系統中使用相同的目錄。

但是 Assertion 是唯一的例外,上述的 "java -ea -da:com.foo",
除了啟動 com.foo 的 Assertion 機制, com.foo 的 subpackage 也會啟動。

在 Assertion 未啟用的情況下,JVM 會忽略 Assertion 的處理。


Assettion 在以下的情況不建議被使用:

  1. 用來驗證 public method 的 argument。
    這是因為 public method 可以被任何人呼叫, 而在 Assetion 未啟用的情況下, 即使是不正常的參數, 程式仍然會繼續執行,應該改用例外處理。
    只適用於 private method 的 argument。
  2. 用來驗證 public method 的 argument。
    原因同上。
  3. 用在會導致 side effect 的情況下。
    程式在 assertion 的檢查過程中,不應該改變程式目前的 state。

沒有留言:

張貼留言