nullか長さ0の配列か

Effective Java プログラミング言語ガイド

Effective Java プログラミング言語ガイド

の項目27にnullではなく長さ0の配列を返せとある。

長さ0の配列を返せば呼び出し側でnullチェックしなくていいしね。

これに関して身近で話題になったことを備忘録として書いておく。

servlet-2_4-fr-spec.pdf」のp238,239にある「SRV.15.1.3 HttpServletRequest」のgetCookies()メソッドには、

Returns: an array of all the Cookies included with this request, or null if
the request has no cookies

とあり、リクエストにクッキーが無い場合nullを返すのが仕様だ。

ただ、
http://www-06.ibm.com/jp/software/websphere/developer/was/wv61/migration/pdf/was61migrationguide_080215.pdf
のp76にあるようにWAS3.5以前のバージョンでは長さ0の配列を返している。

またTagExtraInfo#getVariableInfo(TagData)の戻り値 - wyukawa’s blogのような例もある。

なので、WAS3.5以前のバージョンで動くアプリ側で、

Cookie[] cookies = request.getCookies();
if(cookies.length > 0) {
...

なのがあったらWASをバージョンアップしたらヌルポになる可能性があるね。

nullチェックも

Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0) {
...

と書いたつもりが、

Cookie[] cookies = request.getCookies();
if(cookies != null || cookies.length > 0) {
...

と書いた場合、やっぱりWASをバージョンアップしたらヌルポになる可能性があるね。


この辺り実装依存になっている可能性もあるので、nullでも長さ0の配列でもどっちが返ってきても
いいようにしとくのが安全だね。

SeasarだったらArrayUtilをつかって、

Cookie[] cookies = request.getCookies();
if(!ArrayUtil.isEmpty(cookies)) {
...

とやるかんじかな。

配列に限らず文字列操作とかもユーティリティ使うようにしたほうが安全だね。