Java/Optional

出典: フリー教科書『ウィキブックス(Wikibooks)』

NULL許容型[編集]

NULL許容型(nullable type)は、プログラミング言語において、変数が値を持たないことを明示的に許容する型のことです。通常、NULL許容型は、値が存在しないことを示すために特別な値(通常はNULL、nil、またはundefinedなど)を持ちます。

NULL許容型の主な目的は、nullポインタ例外などのランタイムエラーを回避し、プログラムの安全性を向上させることです。これにより、プログラマーは値が存在しない場合に備えて適切にコードを記述することができます。

多くのプログラミング言語でNULL許容型がサポートされています。例えば、JavaのOptional型、SwiftのOptional型、C#のNullable型などがあります。これらの型は、値が存在しない場合を明示的に示すことで、コードの安全性と可読性を向上させます。

以下は、各プログラミング言語におけるNULL許容型の例です:

各プログラミング言語におけるNULL許容型の例
言語 説明
Optional<T> Java JavaのOptional型は、値が存在しない場合にnullではなくOptional.empty()を返すため、nullポインタ例外を回避し、コードの安全性を向上させます。
Type? Kotlin KotlinのNullable型は、変数やプロパティの型の末尾に "?" を付けることで、その変数やプロパティがnullを許容するNullable型として扱われます。
Option<T> Scala ScalaのOption型は、Some値を持つ場合は値が存在し、Noneを持つ場合は値が存在しないことを示します。これにより、nullチェックやnullポインタ例外を回避することができます。
Nullable<T> C# C#のNullable型は、値型にnullを割り当てるための型です。通常の値型ではnullを許可しないため、Nullable型を使用することでnull許容型を表現します。
Option<T> Swift SwiftのOptional型は、値が存在する場合はSome値を持ち、値が存在しない場合はnilを持ちます。これにより、nilチェックやnilによるクラッシュを回避するために使用されます。

Optional[編集]

JavaのOptionalは、Java 8で導入されたクラスで、nullセキュリティという問題に対処するための手段の1つです。Optionalは、値が存在するかどうかを示すラッパークラスであり、nullを明示的に処理することなく、値の有無を安全に操作するための手段を提供します。

Optionalは以下のように使用できます:

  1. Optionalの作成: Optional.ofNullable() メソッドを使用して、可能性のあるnull値を含むオブジェクトからOptionalを作成できます。
    String str = null;
    Optional<String> optionalStr = Optional.ofNullable(str);
    
  2. 値の取得: 値が存在する場合、Optional.get() メソッドを使用してその値を取得できます。ただし、値が存在しない場合は NoSuchElementException がスローされる可能性がありますので、Optional.isPresent() メソッドを使用して事前に値の存在を確認することが重要です。
    if (optionalStr.isPresent()) {
        String value = optionalStr.get();
        System.out.println("Value: " + value);
    } else {
        System.out.println("Value is not present.");
    }
    
  3. 値の存在確認とデフォルト値の提供: 値が存在しない場合にデフォルト値を提供する場合は、Optional.orElse() メソッドを使用できます。
    String valueOrDefault = optionalStr.orElse("Default Value");
    
  4. 値の存在確認と値の処理: 値が存在する場合のみ、値に対して処理を行いたい場合は、Optional.ifPresent() メソッドを使用できます。
    optionalStr.ifPresent(value -> System.out.println("Value: " + value));
    

Optionalは、null値の扱いに関するバグを減らし、より安全で明確なコードを作成するのに役立ちます。 ただし、Optionalを過度に使用することは、コードを複雑にする可能性があるため、適切なバランスが必要です。

以下は、JavaのOptionalクラスの一部の主要なメソッドとその説明を表形式で示したものです。

Optionalクラスの主要なメソッド一覧
メソッド 説明
empty() 空のOptionalインスタンスを作成します。
of(T value) 指定された非nullの値でOptionalインスタンスを作成します。
ofNullable(T value) 指定された値がnullであれば空のOptional、そうでなければその値でOptionalインスタンスを作成します。
isPresent() Optionalに値が含まれている場合はtrueを返します。
ifPresent(Consumer<? super T> consumer) Optionalが値を含んでいる場合、指定されたコンシューマー関数を値に適用します。
get() 値を取得します。値が存在しない場合は例外NoSuchElementExceptionをスローします。
orElse(T other) 値が存在する場合はその値を返し、そうでなければ指定された値を返します。
orElseGet(Supplier<? extends T> supplier) 値が存在する場合はその値を返し、そうでなければサプライヤー関数の結果を返します。
orElseThrow(Supplier<? extends X> exceptionSupplier) 値が存在する場合はその値を返し、そうでなければ指定された例外をスローします。
filter(Predicate<? super T> predicate) 値が述語によってテストされ、述語がtrueを返した場合はこのOptionalを返します。それ以外の場合は空のOptionalを返します。
map(Function<? super T, ? extends U> mapper) 値を関数に適用し、結果が非nullであればそれを含むOptionalを返します。そうでなければ空のOptionalを返します。
flatMap(Function<? super T, Optional<U>> mapper) 値を関数に適用し、結果が空のOptionalでない場合はそのOptionalを返します。そうでなければ空のOptionalを返します。
equals(Object obj) 指定されたオブジェクトがこのOptionalと等しいかどうかを比較します。
hashCode() Optionalのハッシュコード値を返します。
toString() Optionalの文字列表現を返します。

これらのメソッドは、Java 8からOptionalクラスで導入され、nullを避けるために便利な方法を提供します。

Optionalが出来ても、参照型はnullを取り得る[編集]

Optionalはnullを扱う際の安全性を向上させるための手段ですが、参照型には依然としてnullを取り得るという点に留意する必要があります。

Optionalは、主にnullを返す可能性のあるメソッドの戻り値や、メソッドの引数として使用されます。しかし、既存のコードや外部ライブラリとの連携、あるいは一時的なnull値の許容など、様々な理由でnullが依然として存在することがあります。

そのため、Optionalを使用することでnullの扱いを明確にすることができますが、すべてのnullを完全に排除することは難しい場合があります。したがって、プログラマーは依然としてnullの可能性に備えてコードを記述する必要があります。