web-dev-qa-db-ja.com

Java 8オプション。ofおよびofNullableの理由

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チェックの場合?

16
hades

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'
}

つまり、どちらを選択するかの決定は、アプリケーション設計とともに、valuenull or not


あなたの期待の部分では、それはOptionalが実際に意図したものではありませんでした。 APIノートはこれをさらに明確にします(鉱山のフォーマット):

Optionalは、主に「結果なし」を表す明確な必要性があり、nullを使用するとエラーが発生する可能性があるメソッドの戻り型として使用することを目的としています。 .型がOptionalの変数は、決してitself be null;常にOptionalインスタンスを指す必要があります。


optionalの目的は、NullPointerException例外に取り組むことです。

Aside:明確に説明するために、当然、選択により暗黙的に、NPEを実行時にスローするかどうかを定義できます。ただし、コンパイル時には決定されません。

19
Naman

optionalの目的はNullPointerException例外に取り組むことです

はい、ありますが、使用時と作成時ではありません。

したがって、メソッドからOptionalを受け取った場合、Optional.ifPresentOptional.orElseOptional.orElseGet、およびOptional.orElseThrowメソッドを使用してNPEを回避できます。

ただし、オプションを作成する場合はそうではありません。これは独自のメソッドであるため、オブジェクトがNULL可能かどうかを知る必要があります。


Optionalの主なポイントは、returnがないことを示す値を返す関数の手段を提供することです値この説明 を参照してください。これにより、呼び出し元は流なメソッド呼び出しのチェーンを継続できます。

スチュアートマークス

詳細な説明については、 この投稿 をお読みください。

12
ETO

Javadocを使用すると、非常にシンプルで明確になると思います。

Optional.of(T value)は、null値が存在せず、プログラムよりもnull値が発生することが確実な場合に使用されます。 NullPointerExceptionをスローし、バグと見なします。

Optional.ofNullable(T value)は、null値がある可能性があることがわかっている場合に使用されます。正常に動作します。


なぜ人々はnullチェックのために通常のif-elseメソッドの代わりにオプションを選ぶのですか?

6
NullPointer

いくつかの回答とコメントを読んだ後、この説明が欠落していると思います。次のような方法を考えます

public Optional<String> name(Customer c) {
    return c.isNew() ? Optional.ofNullable(getName(c)) : Optional.of(getName(c));
}

ここでは、顧客が新しくなく、名前を持つことになっている場合、NullPointerExceptionをスローします。 nullである場合、コードは一貫性がありません。ただし、顧客が新しい場合、名前はまだ存在しない可能性があるため、その場合はofNullableであり、メソッドはOptionalを返します。

5
JollyJoker

なぜ人々は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 を読んで、より多くのオプションのチェーンメソッドを読んで、あなたの利益のために使用することを強くお勧めします。

4
HPH
  • Optional.ofNullableは、nullを返すことができる既存のAPIのラッパーです。 APIのコンシューマとして呼び出します。
  • Optional.of/Optional.emptyは、Optionalを念頭に置いて記述された新しいコード用です。 APIのプロバイダーとしてof/emptyで作成されたOptionalを返します。
1
dnt