目次

アサーション

  • assertキーワードはJDK1.4で導入された。
    • C++などの他の言語がすでに持つエラーチェックを提供することができる。
  • 書式は"assert Boolean_Expression [: Detail_Expression];"である。
    • Boolean_Expressionでfalseのときに、コンパイラがAssertionErrorを発行する。
  • アサーションはデフォルトで無効になっており、手動で有効にする必要がある。
    • 有効にするためにはjavaコマンドならば実行時に-eaオプションを付ける(システムクラスのアサーションを有効にする場合は-esaオプションを付ける)。Antであればjavaタグのネストした<jvmarg>要素のvalue属性に"-ea"を指定する。
  • アサーションはバグを見つけるのに役立つため、開発中・テスト中はアサーションを有効にしておくべきである。
  • システムの動作中にアサーションを無効・有効にする方法はない。
  • システムの動作中にアサーションが有効かどうかを知ることはできる。
boolean flgAssertion = false;
assert flgAssertion = true;

 2行目のassert文はflgAssertionにtrueを代入し、条件節としては必ずtureと評価される。つまり、アサーションエラーは発生し得ない。  もしアサーションが有効のときこのコードが実行されると、flgAssertionがtrueになる。一方、アサーションが無効のときにこのコードが実行されると、1行目でflgAssertionがfalseに設定され、2行目は動作しないため、結局flgAssertionはfalseのままである。

アサーション vs. 例外

  • 処理時間
    • アサーションの場合はアサーションを無視するように仮想マシンを設定することができる。その結果、テスト時や診断時にはアサーションを有効にして問題を見つけ出すことができ、ソフトウェアが安定したり運用したりするときにはアサーションを無効にしてアサーションの処理時間をほぼゼロにすることができる。
  • 見やすさ
    • アサーションを使ったエラーチェックの方がコードが見やすい。

アサーションを使用場所

  • publicメソッドのパラメータ評価にはアサーションを使用してはいけない。なぜならばpublicメソッドは他のプログラマが不適切なパラメータを設定する可能性があるからである。
    • 代わりにNullPointerException,IllegalArgumentExceptionなどの例外を発行するべきである。
  • protectedやprivateのメソッドのパラメータの事前条件・事後条件のチェックにアサーションを用いる。
  • ソフトウェアのユーザー入力のエラーチェックにアサーションを用いてはいけない。
  • 起こるはずのない状況のパラメータや変数のチェックにアサーションを用いる。
  • 無効なコード分岐のチェックにアサーションを使用する。
  • 何らかの処理を行うためにアサーションを使用してはいけない。
    • アサーションは開発者レベルのエラーであり、エラー中でデータの整合性を保持するための修復処理、ロギング処理などを行う場合はアサーションは使わない。
      • なぜならば、ユーザーによってアサーションは無効にされる可能性があるからである。
  • アサーションエラーのメッセージを国際化しない。
    • アサーションは開発者レベルのものなので、メッセージを国際化しようとするのは時間の無駄である。
  • アサーションの条件節だけで用いる変数などは用意しない。
    • アサーションが無効になったときに、その変数が定義されたときに完全に無駄な領域となってしまうから。

参考文献

  • 『Java魂』