32
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

nullを使うのはやめよう

Last updated at Posted at 2015-02-16

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開発では使えないです。)

32
32
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?