nullか長さ0の配列か
- 作者: Joshua Bloch,ジョシュア・ブロック,柴田芳樹
- 出版社/メーカー: ピアソン・エデュケーション
- 発売日: 2001/12/03
- メディア: 単行本
- 購入: 5人 クリック: 124回
- この商品を含むブログ (105件) を見る
長さ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)) { ...
とやるかんじかな。
配列に限らず文字列操作とかもユーティリティ使うようにしたほうが安全だね。