nullを安易に使わない
ツイートのままなんだけど。
メソッド呼んでリスト貰ってforでぐるぐる回す、なんてことはよくやります。全件処理するためにforループなんて何時代だ こほん……こんな感じ。
List list = hoge(); for (Object str : list) { // 何らかの処理 }
で、hogeを覗いてみたらこんな実装だったり。
List hoge() { List list = new ArrayList(); // 何らかの処理 if (list.size() > 0) { return list; } else { return null; } }
これでめでたく、最初に書いたコードはNullPointerExceptionになるわけです。馬鹿じゃないの。
(なんか最近聞かない気もしますけど)防御的プログラミングってのがあります。例えばこんな風に、引数に変なものが来た時に即例外を投げるのとかがよくあります。
void method(Object arg) { if (arg == null) throw new IllegalArgumentException("引数が変"); // 後は安心して引数を使う処理が書ける }
目的は、変な動きをしそうな悪事の芽を早めに摘むこと。
冒頭の例は防御的プログラミングとして、hogeの戻り値に対してnullチェックを行うことも出来ます。それが常識だってところもあるかもしれません。個人的には無しです。安易にnullを使っちゃいけない。もし空になるのが異常ならhogeが例外を投げるべきかもしれないし、そうでないなら空リストを返して、呼び出し側に判断を委ねるべきじゃないかなと。
仲間内で過剰に防御し合う、誰も信じられないとでも言うような疑心暗鬼なコードを書いてどうするんだとか思ったりします。挙動がよくわからない外部のものを使うなら理解出来ますが、自分たちが制御できる範囲ならば余計な防御でコードの可読性を落とすべきじゃない。だってそれってノイズじゃないですか。