nullを使うのはやめよう
null参照の発明は10億ドルにも相当する誤りだった。
アントニー・ホーア
nullとは?
null は未定義なことを表す特殊な参照。
型として考えると、すべての型の部分型といえる最小の要素といえます(Bottom型)。
Java
null は Java において当たり前のように使われる。
null は使ってはいけない
型システムに守られたプログラミングが崩壊します。
nullはどのような型にでもなれる特殊な型です。
ある型の値 a に対して、内部にnullが入っているか入っていないかを静的に判断することはできません。
null参照を使うとどうなるか
public Foo getFoo(int n) {}
上記のようなちゃんと型付けされた関数でも、nullが返ってくるかもしれないので返ってきた値をそのまま使うことはできません。
常にオブジェクトが、nullかそうじゃないかを意識してプログラミングする必要があります。
→ 面倒だし、よく忘れます。容易にバグが入り込みます。
ぬるぽが起きた時、null参照がどこから渡ってきたか追跡するの大変です。
安易にどんな型にでもなれる型を返すのはやめましょう。
nullを使うのは安易にキャストしまくるプログラミングと同じです
Java における一般的なプログラミング
User user = list.getUser();
if (user != null) {
name = user.getName();
if (name != null) {
// 何かしらの処理
}
}
// こんな辛いプログラミングはもういやだ。
解決手法
null object
マーチン・ファウラーのリファクタリングが詳しいです。
nullの代わりに、オブジェクトとして表現する。
あるインターフェースに対して、未定義なことを表すオブジェクトを実装します。
デメリットはとにかく面倒くさい。
Maybe (Option) 型
関数型言語で一般的に使われる手法です。
data Maybe a = Nothing | Just a
Maybe型は、失敗するかもしれないということを表す型です。
Maybe が付いている場合は値がない可能性があると静的に理解でき、Maybe を外してさえしまえば以降はただの値として扱えます。
私的にはこれがお手軽でオススメです。(Java 8 からは Optional としてありますが、Android開発では使えないです。)