JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
2022-02-13 16:53:58
作者がNPEを報告するために使ったので、特に言うことはないです。
普段はOptionalを使ってデフォルト値を設定し、NULLを排除しています。しかし、最近Optional.ofを使ってNullポインタを報告しました。
では、ソースコードを見てみましょう。
/**
* Returns an {@code Optional} with the specified present non-null value.
*
* @param <T> the class of the value
* @param value the value to be present, which must be non-null
* @return an {@code Optional} with the value present
* @throws NullPointerException if value is null
*/
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
/**
* Constructs an instance with the value present.
*
* @param value the non-null value to be present
* @throws NullPointerException if value is null
*/
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
/**
* Checks that the specified object reference is not {@code null}. This
This * method is designed primarily for doing parameter validation in methods
This * method is designed primarily for doing parameter validation in methods * and constructors, as demonstrated below:
* <blockquote><pre>
* public Foo(Bar bar) {
* this.bar = Objects.requireNonNull(bar);
* }
* </pre></blockquote>
*
* @param obj the object reference to check for nullity
* @param <T> the type of the reference
* @return {@code obj} if not {@code null}
* @throws NullPointerException if {@code obj} is {@code null}
*/
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
メソッドを段階的にチェックすると、T 値が null の場合、Optional.of(T 値) を使用すると手動で NullPointerException() をスローすることがわかります。
ですから、このメソッドは、NULLが存在してはいけないということに、特に注意して使ってください。
では、どの方法を使えばいいのでしょう。
Optional.ofNullableです。
/**
* Returns an {@code Optional} describing the specified value, if non-null,
* otherwise returns an empty {@code Optional}.
*
* @param <T> the class of the value
* @param value the possibly-null value to describe
* @return an {@code Optional} with a present value if the specified value
* is non-null, otherwise an empty {@code Optional}
*/
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
/**
* Returns an empty {@code Optional} instance. no value is present for this
* No value is present for this.
No value is present for this * Optional.
* @apiNote Though it may be tempting to do so, avoid testing if an object
* is empty by comparing with {@code ==} against instances returned by
* {@code Option.empty()}. There is no guarantee that it is a singleton.
There is no guarantee that it is a singleton. * Instead, use {@link #isPresent()}.
*Instead, use {@link #isPresent()}.
* @param <T> Type of the non-existent value
* @return an empty {@code Optional}
*/
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
/**
* Common instance for {@code empty()}.
*/
private static final Optional<? > EMPTY = new Optional<>();
/**
* Constructs an empty instance.
*
* @implNote Generally only one empty instance, {@link Optional#EMPTY},
* should exist per VM.
*/
private Optional() {
this.value = null;
}
/*
* Return the value if present, otherwise return {@code other}.
*@param other
* @param other the value to be returned if there is no value present, may
* be null
* @return the value, if present, otherwise {@code other}
*/
public T orElse(T other) {
return value ! = null ? value : other;
}
えー、これは動作します、もしvalueがnullなら、新しいOptional()を手動で作成します;しかしthis.value = nullです。だから今回は手動でnullポインタを投げるコードのブロックからジャンプします。このとき、orElse(T other)を使えばいいのです。ソースコードを見ると、value == nullの場合はotherの値が取られるようです。
関連
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
javaの非静的メソッドを静的に参照することができない
-
SocketException java.netの4つの例外解決策。
-
アノテーション「@Retention」の役割
-
eclipse にリソースリーク:'in' が閉じない
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
com.fasterxml.jackson.databind.JsonMappingException を解決してください。複雑な型(リスト、マップ)を2つの方法で処理するために、ジャクソンに適したものはありません。
-
java1.8ソースコード ArrayListソースコード解釈
-
JSoupは、新バージョンの正方学務システム(イントラネット-学務システム)にログインし、情報処理の詳細をクロールするシミュレーションを行います。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Uncaught ReferenceError: は定義されていません。
-
ジャバアレイ
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
Junitのユニットテストエラー
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
Java:未解決コンパイル問題の解決方法
-
htmlとwordの相互変換の実装(画像あり)
-
コレクション - PriorityQueueソースコード解析
-
javaの継承の基本的な実装