Asakusa Framework Advent Calendar 2015の10日目です。
RDBのテーブルのデータをJavaで扱う場合、テーブルレイアウトと同等なプロパティー(フィールド)とセッター・ゲッターメソッドを持つJavaBeansのようなクラスを使うことがあるかと思います。
Scalaでは、そういう場合はcase classを使うのが便利です。
フィールドを定義するだけで、セッター・ゲッターメソッドおよびScalaで扱うのに便利なメソッドが自動生成されます。
AsakusaFWでは、ファイルやRDBのテーブルから読み込んだ1レコード分のデータを扱うのに、データモデルと呼ぶクラスを使用します。
データモデルクラスは、DMDL(データモデル定義言語)というAsakusaFW独自の言語で記述し、コンパイルすることで生成されます。
表面上、データモデルクラスはゲッター・セッターメソッドを持つシンプルなクラスですが、内部ではそれぞれのプロパティーの値をOption系クラス(アドベントカレンダー8日目参照)で保持しており、Option系クラスでアクセスするメソッドも提供されています。
また、HadoopのWritable関連のメソッド(シリアライズ・デシリアライズに使う)も実装されています。
Java8のOptionalは基本的にメソッドの戻り値で使うことが推奨されており、普通はフィールドで保持するのには使いません。
が、AsakusaFWで扱う対象であるRDBのテーブルにはnullが入っていることがありますし、CSVファイルで何も入っていない項目はnullとして扱います。また、AsakusaFWのOption系クラスはWritableの機能も持っているので、データモデルクラスのフィールドはOption系クラスで保持するようになっているのだと思います。(データモデルのWritable関連メソッドは、フィールドのOption系クラスのWritable用メソッドを順番に呼ぶような実装になっています)
ちなみに、AsakusaFWのStringOptionは、内部ではHadoopのTextクラスで保持するようになっています。
HadoopのWritableを扱う上ではその方がいいかもしれないですが、今後Hadoop以外を相手にすることになったら、足を引っ張りそうな気がしてちょっと心配です(苦笑)