assertの効果

java1.4から導入されたassertについて前から思っていることを書いてみます。
assertはその動きのみを考えれば実行時に発生してはいけない条件のチェックを行うための機能といえます。しかしながら私が思うに、条件チェックの効果よりも、何らかの処理が実行されるときの事前条件をソースコード上に記述できるという点の方が効果が大きいと思ってたりします。
たとえば以下のコードがあったときに、

private int func( int a ) {
  return 1/a;
}

もしaに0が渡された場合0除算となってしまいます。このとき、このコードを記述したプログラマがシステム的にaには絶対に0が入らないというのを考慮して記述したのか、それとも単にチェックミスでaに0が渡される可能性を失念していたのかがソースコード上では不明確です。
そこで、

private int func( int a ) {
  assert( a!=0 ): "Argument a is zero.";
  return 1/a;
}

と、assert文を追加するだけでaに0が渡されることがありえないと前提であるという「意図」ソースコード上に埋め込むことができます。

同様のことをIllegalStateException例外を送出することで実現しても良いとは思いますが、記述の手軽さや例外送出の記述に比べてソースコード上で目立つことからassertの方がよいと思われます。
#catch( Exception ex )とかってされてもへいきですしね。

ちなみにassertの利点としてよく語られるオフにすることが可能ってのですが、私はそれほど重要だとは思ってません。assertの中に書く条件式にオフにしなければいけないくらい重い式を書くことはそうそう無いと思うんで。
#Sunのjava.exeですが、assertをデフォルトでオンにしてほしいですね・・・JDKとしてインストールした場合はなおさらです。