nullを受け付けないメソッドにnullを渡した時の挙動
っていう話を書こうと思ってたら、以前書いてた(cf. 前提条件を破った場合、どのような挙動をするのか? - 都元ダイスケ IT-PRESS)
上のエントリにも書いたのだが、自分はこういう時IllegalArgumentExceptionを使うようにしている。そして、commons-lang v2.6 をよく使っていたので、その中の Validate#notNull を利用してnullチェックをするのが自分のスタイルだ。
しかし、いい加減commons-lang v3系に移行しようかな、と考えて色々触っていたのだが、v3から Validate#notNull の仕様が変わり、NullPointerExceptionを投げるようになったのだ。
といった辺りの俺周辺タイムライン → Javaでnullを受け付けないメソッドにnullを渡したらどうなるべきか - Togetter
で、いくつかのライブラリの引数チェックユーティリティの仕様を調べてみたのだが、以下の通り、統一感がない。。。
Apache | commons-lang v2.6 | Validate#notNull | IllegalArgumentException |
Apache | commons-lang v3.1 | Validate#notNull | NullPointerException |
Spring | spring-core v3.0.5 | Assert#notNull | IllegalArgumentException |
guava v10.0.1 | Preconditions#checkNotNull | NullPointerException |
最後に、Facebook Questionsを利用してアンケートを取ってみたところ…。IAEの圧勝。
http://www.facebook.com/questions/309546165723428
色々考えて出した結論
自分が引数チェックを執拗に行うのは、アプリケーションコードというよりも、汎用ライブラリコード側だ。そういったライブラリについては、事実上Validateを使うためだけにcommonsに依存している状態だ。別に自分はcommonsにこだわりがある訳じゃない。
むしろ、汎用ライブラリはなるべく依存ライブラリが無い方が良いだろう。
というわけで、…ライブラリ毎にオレオレ引数チェックユーティリティクラスをIAE版として作って、コピーして使うのがいいのかな、と思った。