Java 8's Optional )に関する質問があります。その目的はNullPointerException
例外に取り組むことです。
問題は、両方のタイプを選択する理由は何ですか:
Optional.of(T value) <-----non-null value, null value will throw NPE
Optional.ofNullable(T value) <----- nullable value
私が期待するのは、私が使用するとき:
Optional.of(nullValue);
NullPointerException
はスローされません。
いくつかの返信後に私の質問を拡大しました:
なぜ人々は通常のif-else
nullチェックの場合?
Optional.of
のjavadocは、明示的に読み取ります:
@throws NullPointerException if value is null
そして、あなたが期待するケースを処理する要件は、次のような小さなコードブロックであるOptional.ofNullable
を使用することで明らかになります。
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value); // 'Optional.of'
}
つまり、どちらを選択するかの決定は、アプリケーション設計とともに、value
がnull
or not。
あなたの期待の部分では、それはOptional
が実際に意図したものではありませんでした。 APIノートはこれをさらに明確にします(鉱山のフォーマット):
Optional
は、主に「結果なし」を表す明確な必要性があり、null
を使用するとエラーが発生する可能性があるメソッドの戻り型として使用することを目的としています。 .型がOptional
の変数は、決してitself benull
;常にOptional
インスタンスを指す必要があります。
optionalの目的は、NullPointerException例外に取り組むことです。
Aside:明確に説明するために、当然、選択により暗黙的に、NPEを実行時にスローするかどうかを定義できます。ただし、コンパイル時には決定されません。
optionalの目的は
NullPointerException
例外に取り組むことです
はい、ありますが、使用時と作成時ではありません。
したがって、メソッドからOptional
を受け取った場合、Optional.ifPresent
、Optional.orElse
、Optional.orElseGet
、およびOptional.orElseThrow
メソッドを使用してNPEを回避できます。
ただし、オプションを作成する場合はそうではありません。これは独自のメソッドであるため、オブジェクトがNULL可能かどうかを知る必要があります。
Optionalの主なポイントは、returnがないことを示す値を返す関数の手段を提供することです値。 この説明 を参照してください。これにより、呼び出し元は流なメソッド呼び出しのチェーンを継続できます。
スチュアートマークス
詳細な説明については、 この投稿 をお読みください。
Javadocを使用すると、非常にシンプルで明確になると思います。
Optional.of(T value)
は、null
値が存在せず、プログラムよりもnull値が発生することが確実な場合に使用されます。 NullPointerException
をスローし、バグと見なします。
Optional.ofNullable(T value)
は、null
値がある可能性があることがわかっている場合に使用されます。正常に動作します。
いくつかの回答とコメントを読んだ後、この説明が欠落していると思います。次のような方法を考えます
public Optional<String> name(Customer c) {
return c.isNew() ? Optional.ofNullable(getName(c)) : Optional.of(getName(c));
}
ここでは、顧客が新しくなく、名前を持つことになっている場合、NullPointerException
をスローします。 null
である場合、コードは一貫性がありません。ただし、顧客が新しい場合、名前はまだ存在しない可能性があるため、その場合はofNullable
であり、メソッドはOptional
を返します。
なぜ人々はnullチェックのために通常のif-elseメソッドの代わりにOptionalを選ぶのですか?
_Optional<T>
_クラスの主なポイントは、null safeマッピング操作を実行するための手段を提供することです。
employeeOptional.map(Employee::getName).map(String::toUpperCase).ifPresent(upperCasedNameConsumer)
上記の式は、単一の読み取り可能な式の_if-else
_ステートメントのカスケードを置き換えることができます。
_Optional.of
_は、指定された引数が_null-null
_値になるようにアサーションを提供します。それ以外の場合、入力が不明な場合は_Optional.ofNullable
_を選択できます。
_Optional<T>
_クラスの javadoc を読んで、より多くのオプションのチェーンメソッドを読んで、あなたの利益のために使用することを強くお勧めします。
Optional.ofNullable
は、null
を返すことができる既存のAPIのラッパーです。 APIのコンシューマとして呼び出します。Optional.of/Optional.empty
は、Optional
を念頭に置いて記述された新しいコード用です。 APIのプロバイダーとしてof/empty
で作成されたOptional
を返します。