Objects.requireNonNullElse()とは何か
Javaで業務システムを開発していると、「値がnullだった場合はデフォルト値を使いたい」という場面が頻繁に発生します。
例えば、ユーザー名が未設定の場合は「ゲスト」を表示したい、設定ファイルの値が存在しない場合は初期値を使用したい、といったケースです。
そのような場面で活躍するのが
Objects.requireNonNullElse()
です。
このメソッドはJava 9で追加されたユーティリティメソッドで、対象の値がnullの場合に指定したデフォルト値を返してくれます。
Objects.requireNonNullElse(値, デフォルト値);Java動作は非常にシンプルです。
- 値がnullでない → 元の値を返す
- 値がnull → デフォルト値を返す
nullチェックとデフォルト値設定を一行で実現できるため、実務での可読性や保守性向上に役立ちます。
まずは従来の書き方を理解しよう
Objects.requireNonNullElse()が登場する前は、次のようなコードがよく書かれていました。
// ユーザー名
String userName = null;
// nullチェック
if (userName == null) {
userName = "ゲスト";
}
// 出力
System.out.println(userName);Java動作には問題ありません。
しかし、nullチェックが増えるほどコードが長くなり、可読性が低下します。
そこでObjects.requireNonNullElse()を使用します。
// ユーザー名
String userName = null;
// nullなら「ゲスト」を利用
userName =
Objects.requireNonNullElse(
userName,
"ゲスト"
);
// 出力
System.out.println(userName);Javaよりシンプルで分かりやすいコードになります。
ステップバイステップで理解する
ステップ1:変数を準備する
// ユーザー名は未設定
String userName = null;Javaこの状態では値が存在しません。
ステップ2:デフォルト値を指定する
// nullならゲストを利用
String result =
Objects.requireNonNullElse(
userName,
"ゲスト"
);Javaステップ3:結果を確認する
// 結果確認
System.out.println(result);Java実行結果
ゲスト
元の値がnullだったため、デフォルト値が返されています。
nullではない場合の動作
次は値が存在するケースです。
// 値あり
String userName = "Tanaka";
// nullではないので元の値を返す
String result =
Objects.requireNonNullElse(
userName,
"ゲスト"
);
// 結果表示
System.out.println(result);Java実行結果
Tanaka
値が存在するため、デフォルト値は使われません。
内部でどのような処理が行われているのか
イメージとしては次のコードに近い動作です。
// イメージ
if (obj != null) {
return obj;
} else {
return defaultObj;
}Javaそのため処理内容は非常に理解しやすいです。
特に重要:デフォルト値はnull禁止
初心者が最も注意すべきポイントです。
Objects.requireNonNullElse()のデフォルト値にはnullを指定できません。
例えば次のコードはエラーになります。
// NG例
String result =
Objects.requireNonNullElse(
null,
null
);Java実行結果
NullPointerException
メソッド名に「requireNonNull」が含まれている通り、 デフォルト値は必ず存在していなければなりません。
つまり、
- 元の値 → nullでもOK
- デフォルト値 → null禁止
と覚えると理解しやすいでしょう。
実務でよくある利用例
ユーザー名の初期値設定
// 入力された名前
String userName = null;
// nullならゲスト
userName =
Objects.requireNonNullElse(
userName,
"ゲスト"
);
System.out.println(userName);Java設定値の初期化
// 設定値取得
String timeout =
config.getTimeout();
// 未設定時のデフォルト値
timeout =
Objects.requireNonNullElse(
timeout,
"30"
);Java画面表示用の値補完
// 部署名
String department =
employee.getDepartment();
// 未設定なら「未所属」
department =
Objects.requireNonNullElse(
department,
"未所属"
);Java業務システムの入力画面や帳票出力で頻繁に利用されます。
実務で使えるテンプレート
文字列用テンプレート
// nullならデフォルト文字列
String value =
Objects.requireNonNullElse(
inputValue,
"DEFAULT"
);Java設定値用テンプレート
// 設定値取得
String apiUrl =
Objects.requireNonNullElse(
config.getApiUrl(),
"https://default.example.com"
);Javaオブジェクト用テンプレート
// ユーザー取得
User user =
Objects.requireNonNullElse(
inputUser,
new User("ゲスト")
);JavaObjects.requireNonNull()との違い
初心者が混同しやすいポイントです。
Objects.requireNonNull()
nullなら例外を発生させます。
// nullならエラー
User user =
Objects.requireNonNull(
inputUser
);Java「絶対に存在しなければならない値」に使用します。
Objects.requireNonNullElse()
nullなら代替値を使用します。
// nullなら代替値
User user =
Objects.requireNonNullElse(
inputUser,
guestUser
);Java「存在しなくても代替手段がある値」に使用します。
Objects.requireNonNullElseGet()との違い
さらに経験を積むと、
Objects.requireNonNullElseGet()
にも出会います。
両者の違いはデフォルト値の生成タイミングです。
requireNonNullElse()
// 常に生成される
Objects.requireNonNullElse(
user,
createGuestUser()
);Java引数が渡される時点でデフォルト値が生成されます。
requireNonNullElseGet()
// 必要な時だけ生成
Objects.requireNonNullElseGet(
user,
() -> createGuestUser()
);Javanullだった場合だけ生成されます。
デフォルト値の生成コストが高い場合は、requireNonNullElseGet()の方が適しています。
情報セキュリティの観点から見る重要性
業務システムでは入力値の欠損や設定不備が発生することがあります。
その際に安易にnullを放置すると、 後続処理でNullPointerExceptionが発生する可能性があります。
例えば、
- 顧客情報未登録
- 設定ファイル不備
- APIレスポンス欠損
- 入力フォーム未入力
などです。
Objects.requireNonNullElse()を活用することで、安全な代替値を利用しながら処理を継続できます。
これはシステムの可用性向上にもつながります。
ただし、重要な認証情報や権限情報などは安易にデフォルト値へ置き換えず、例外として扱うべきケースもあります。
「代替値で継続してよいデータか」を業務要件に沿って判断することが重要です。
初心者が覚えておくべき重要ポイント
- 値がnullならデフォルト値を返す
- 値が存在する場合は元の値を返す
- デフォルト値にはnullを指定できない
- コードが短く読みやすくなる
- 入力補完や設定値補完で頻繁に利用される
- 代替値で処理継続できる場面に向いている
- 絶対に必須の値ならrequireNonNull()を使う
まとめ
Objects.requireNonNullElse()は、Javaでnullを安全に扱うための便利なユーティリティメソッドです。
- nullならデフォルト値を返す
- nullでなければ元の値を返す
- デフォルト値にはnullを指定できない
- コードの可読性と保守性が向上する
- 入力値補完や設定値補完で非常によく利用される
- NullPointerExceptionの回避に役立つ
- 実務ではrequireNonNull()と使い分けることが重要
特に業務システムでは、「値が存在しないことは珍しくないが、処理は継続したい」というケースが数多くあります。そのような場面でObjects.requireNonNullElse()を活用すると、シンプルで読みやすく、安全なコードを書くことができるようになります。
