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
Google guava v10.0.1 Preconditions#checkNotNull NullPointerException

最後に、Facebook Questionsを利用してアンケートを取ってみたところ…。IAEの圧勝。

http://www.facebook.com/questions/309546165723428

色々考えて出した結論

自分が引数チェックを執拗に行うのは、アプリケーションコードというよりも、汎用ライブラリコード側だ。そういったライブラリについては、事実上Validateを使うためだけにcommonsに依存している状態だ。別に自分はcommonsにこだわりがある訳じゃない。
むしろ、汎用ライブラリはなるべく依存ライブラリが無い方が良いだろう。

というわけで、…ライブラリ毎にオレオレ引数チェックユーティリティクラスをIAE版として作って、コピーして使うのがいいのかな、と思った。