Google guava Release 10 で追加された com.google.common.base.Optional
null の判断そして判定結果に基づく処理を書きやすくする?
Optional は、コンストラクタを持たない、自らの static メソッドで生成する。
以下、3つのメソッドがある。
public static <T> Optional<T> of(T t)
引数 t が null なら、NullPointerException を発生する。
引数 t が、not null で、Optional<T> を生成
public static <T> Optional<T> fromNullable(@Nullable T nullableReference)
引数が null でも、引数で指定するタイプ T の Optional を生成
public static <T> Optional<T> absent()
null を表す Optional を生成、fromNullable(null) と同じ
Optional が提供するメソッドは、
public T get()
Optional インスタンスが抱える値が null の場合は、
java.lang.IllegalStateException: value is absent
と例外を発生させる。
null でなければ、Optional インスタンスが抱える値を返す。
public T orNull()
Optional インスタンスが抱える値として、null または、値を返す。
Optional.of(T t) で生成した場合、必ず null でない値を返す。
public T or(T defaultValue)
Optional インスタンスが抱える値が null の場合は、
引数 defaultValue の値を返す。
null でなければ、Optional インスタンスが抱える値を返す。
------
この Optional の使い方として、例えば以下のような使い方が考えられる。
Integer port;
// 何かの処理で port が生成または、初期化されない。
int reqPort = Optional.fromNullable(port).or(80);
でも、三項演算子だって同じことができる。
int reqPort = port==null ? 80 : port;
これだけの単純な比較なら、Optional の fromNullable と or メソッドを連携させても
あまり旨みがない。
入れ子の三項演算子がたくさん出るなら綺麗にできる。