Quantcast
Channel: ひしだまの変更履歴
Viewing all articles
Browse latest Browse all 262

Java8 Optinal・Scala・AsakusaFWの類似点・相違点

$
0
0

Asakusa Framework Advent Calendar 2015およびScala Advent Calendar 2015の8日目です。

2015/11/28のJJUG CCC Fall 2015にて『Java8 Stream API・Apache Spark・Asakusa Frameworkの類似点・相違点』というタイトルで発表してきましたが、そのOptional版ですw

自分がJava8のOptionalScalaのOption)的なものを知ったのは、Scala→AsakusaFW→Java8の順です。
初めてScalaでOptionを知ったとき、nullを包み隠すのはいいとしても、nullだったらgetで例外が発生するのは不便だなぁと思っていました^^;
しかしその後に知ったAsakusaFWでもJava8でも、単なるgetは中がnullだと(種類こそ違えど)例外が発生するので、Option界?では当たり前のことのようです。

まぁ、値が欲しければor(あるいはorElse)といったメソッドでnullだったときのデフォルト値を指定できるので、nullをそのまま使ってif文でチェックするよりは便利です。
ただ、AsakusaFWはJava6の頃に出来た為、orメソッドにはラムダ式でなく値そのものを渡さないといけません。orメソッドのチェーンを作りたいときはちょっといまいちですが、時代的に仕方ないですね。

まだJava8が出ていなかった頃、(Scalaも知らない人に対して)AsakusaFWのOption系クラスを説明するのは面倒でしたが、Java8が出た今、「Optionalと同様である」と一言で言えるようになったのは有り難いです(笑)

ちなみにAsakusaFWでは使用するデータ型が決まっているので、それぞれに応じたOptionクラスが用意されています。
例えば以下のような感じです。

Java8ScalaAsakusaFW Optional<String> Option[String] StringOption OptionalInt Option[Int] IntOption OptionalLong Option[Long] LongOption Optional<Date> Option[Date] DateOption

Javaだとどうしても型毎にクラスを用意しないといけないので、クラスが増えてしまいますねぇ。

AsakusaFWのOption系クラスとJava8 Optional・Scala Optionとの最大の違いは、Java8・Scalaは不変オブジェクト(Optionの中の値を変更することが出来ない)なのに対し、AsakusaFWのOption系クラスは可変オブジェクトだということです。

AsakusaFWは分散バッチアプリケーションを作る為のフレームワークなので、すなわち、大量データを対象としています。
レコードを処理する度に毎回Option系クラスのインスタンスを作っているとGCの発生頻度が上がってしまうので、なるべくオブジェクトを使い回すような設計になっているのです。
純粋関数型信者からするといけてないように思えるかもしれませんが、目的に応じた設計思想であり、これはこれでありなんじゃないかと思います。


Viewing all articles
Browse latest Browse all 262

Trending Articles