Java 8 のOptional を使ってみる


こんにちは、馬場です。

2ヶ月ほど前に「比較:並行処理 - Java とScala とGo -」という、プログラムを比較する記事を書きました。この記事中のプログラム、ScalaではOptionを使っていたのですが、Java 8 のプログラムの方では「null」の処理を書いていたところ、レビューアに指摘を受けました。

「Java 8 の方のプログラムでOptional を使っていないのは、わざとですか?」

... すみません。そうでした。Javaは8からOptionalが使えるようになったんですよね。そこで、nullを多用しているプログラムをOptionalを活用するように書き換えてみました。

変更前 - null 判定をしているプログラム

以前の記事で紹介した二分探索木を表すTree クラスは以下のようになっていました。

ポイントは、leftもrightもnullかもしれないという点です。ですので、leftやrightを取り扱うプログラムでは気をつけて忘れずにnull の場合の処理を書かなくてはいけません

変更後 - Optional を利用する

ここで、このnullかもしれないleftやrightをOptionalに変更します。これによりleftやrightがない場合があるということを明示的に示すことができます。

Optionalのメリット・デメリット

Optional で書き換えたプログラムをみて、みなさんどう感じたでしょうか?正直はじめてみる場合「わかりにくい」「めんどくさい」と感じるのではないでしょうか。実際、Optionalは「これを使うとコードがすっきりする」というものではありません。

Optionalの利用のメリットはその値はないかもしれないということをコードに明示できることです。上の例では、取得したleftやrightはOptionalなので、気をつけずともemptyの場合の処理の記述を強制させられてしまうのです。プログラムの背景や意思を正確に後続の開発者に伝えるという意味でかなり強力です。コメントに「nullかもしれないから気をつけて」と書くよりずっと伝わります。

Scalaをがりがり書いていたときも、最初はOption(=ScalaのOptional)めんどくさーいと思いました。しかし実装を進めていくと「これは間違いなくnullではないんだ」という安心感に変わってきました。Java 8を利用している人はstreamだけでなく、Optional もぜひお試しください。

補足

JavaのnullかもしれないオブジェクトをOptionalに変換するときはofNullableメソッドを使いましょう。

紹介したプログラムでは of メソッドを使っていますがこれはnullではないTree が返されることがわかっているからです。ofにnullを渡すとNullPointerExceptionが発生してとても釈然としない結果になります。


コメントを残す

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