Optional型の変数にget()とifPresent()は使わない

公開日: : 最終更新日:2015/01/12 Java ,

Java8 から導入された Optional を勉強するため、過去にプライベートで書いたコードに Optional を適用してみた。

触れる機会を増やしたこともあって「こういう書き方のほうがそれっぽいかな」みたいなものが掴めてきた気がするし、同時に「こういうのは従来的な書き方だかららしくなくなってしまうのかな」みたいなもの見えてきた気がする。

良いも悪いも無いのかもしれないし、ピントがズレているかもしれないが「今はこういう風に考えている」というメモを残しておく。

icatch-3361b5e1

photo credit: David Marcu via unsplash

目次

1. isPresent() の優先順位を下げた

null ではない場合に何か処理をしたいのであれば ifPresent() もしくは map() を使ってラムダ式で処理する。すべての箇所で ifPresent()map() が適用できるとは限らない。なので isPresent() も使う場合はあるだろうが優先順位を下げた。

この話は Optional 型の引数を受け取るメソッドでのガード節について書いた以下の記事と関連があるのでリンクを貼っておく。

2. get() は控える

get() は格納されている値が確実に null ではないと断言できる場合に使う。格納されている値が null の場合に get() を実行すると NullPointerException が発生してしまうからだ。

null の可能性があるから Optional を使っているのに NullPointerException になっては本末転倒だし。null ではないと分かっているなら、わざわざ Optional でラップしなくてもいいのでは?と思っている。

よって、戻り値が null の可能性がある場合にしか Optional 型を返さないようにメソッドを実装している。

このルールは当たり前のことかもしれないが、これを明確にしたことで Optional 型の変数に対して get() は使わなくなった。null の可能性があるので orElse()orElseGet()orElseThrow() を使って null に対する予防線を張るようにしている。

3. 更新履歴

  • 2014/11/02
    • 初版作成
  • 2015/01/11
    • 文言を修正

4. この記事の内容について

この記事は Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング を読みながら個人的にまとめたことをメモした内容になっています。

調べ物から記事作成までの全て作業はプライベートな時間に行ったものであり、所属組織のリソースは消費していません。また、記事のアイデアも所属組織に由来していません。

記事の内容が必ずしも正しかったり、最新ではないおそれがあります。参考にされる分には構いませんが、記事の内容を取り入れたことによって発生した損害などの責任は負いません。ご利用は自己判断でお願いいたします。

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

  • 著者Cay S. Horstmann
  • 価格¥ 3,024(2014/10/17 時点)
  • 出版日2014-09-22
  • 商品ランキング24027 位
  • 大型本264 ページ
  • ISBN-104844336673
  • 出版社インプレス

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

no image

画像ファイルを選別するFilenameFilter

画像ファイルのみアップロードを許可する仕様があって、何てことはないがフィルターを作って対応したのでメ

記事を読む

no image

Exec Maven Plugin で maven コマンドでアプリを起動する

packaging タグに "jar" を指定した Maven プロジェクトをコマンドラインから起動

記事を読む

icatch_2185253176-resized

Java8 の Optional 型を返す Generics を使ったメソッドを定義する

Java8 の Optional とガード節 に続いて Java8 の Optional ネタ。今回

記事を読む

no image

ファイルの拡張子が JPG であるかを問い合わせるスニペット

特に目新しいこともないが、同じようなことをする機会があるかもしれないのでメモ。Gist にも登録済み

記事を読む

no image

Google Guava の Function を使った文字列加工の FluentIterable サンプル

お客様の都合上 Java7 で開発している案件があるのだが、Java8 の Function とか

記事を読む

no image

Java から VBScript を使って Excel を印刷する

背景 Java のデスクトップアプリを作成していたときの要件に「Excel で作成された帳票を印刷

記事を読む

icatch_4610898091-resized

Java8 の Optional とガード節

メソッドの冒頭で条件チェックを行い、条件を満たしていない場合はさっさと return してしまう「ガ

記事を読む

icatch-thumbnail

レスポンスにサムネイル画像を返す API のサンプル

今回は直接 ImageMagick は関係ありませんが、また画像ネタです。この辺りのことを仕事で扱っ

記事を読む

medium_182531101

ClassLoader を使って getResourceAsStream で取得したファイルを UTF-8 で読み込む

よく使う割には覚えられず毎回調べている気がするので備忘録としてメモしておきます。 文字コードを指定し

記事を読む

no image

画像ファイルのサイズ(縦横じゃなくて容量)を取得するスニペット

File#length で取得できるとは知らなかった。Gist にも登録済み。 /** * 画

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


2 × = 四

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑