最終回は、Scalaプログラミングに欠かせない「パターンマッチ」と、独自機能である「ケースクラス」、そして「トレイト」について説明します。それぞれの機能を、Javaでの場合と比較しながら見ていきましょう。
match式による柔軟なパターンマッチ
Scalaのパターンマッチは、Javaのswitch文をより強化した場合分けの機能を提供します。パターンマッチは多くの言語で採用されていますが、Scalaのものは様々な条件にマッチさせることができ、Scalaプログラミングの中心的な役割を担います。パターンマッチの処理を記述するにはmatch式を利用します。
数値や文字列などでマッチング可能
数値でのマッチの例がリスト7です。変数n(セレクターと呼びます)に対して、match式を適用し、caseによる選択肢は上から下へと順番に検証されます。Javaのswitch文ではbreakを記述しなければ後続の選択肢の処理を実行しますが、match式ではbreakはありません。マッチしたcaseを処理したら、他のcaseを処理せずにmatch式の制御を抜けます。例えば、この例では、case 1で変数nが1に該当すれば=>の次の処理のprintln("one") が実行されます。また、case _はワイルドカードといって、switch文のdefault:に相当します。
また、Javaのswitch文では数値以外のマッチングに対応していませんが(Java SE 6まで。Java SE 7からは、数値以外の文字列も使える)、Scalaのmatch式では、文字列やコレクション、型によるマッチングが可能です。リスト8の例ではInt型や文字列の値、List型の条件を指定して文字列を返しています。
リスト8で見たように、match式では戻り値を返すことができます。=>の後で最後に評価された式の値を戻り値として返せます。
ケースクラスでバリューオブジェクトを簡単実装
ケースクラスは、バリューオブジェクト(値を表現するオブジェクト)を実装するために必要な機能を提供するクラスです。例えば、人の名前を表す人名というバリューオブジェクトは次のように記述できます。
case class PersonName(firstName: String, lastName: String)
このケースクラスを宣言するとコンパイラが以下を自動的に追加します。
- ケースクラスに対応するコンパニオンオブジェクトとファクトリメソッドを追加する
- ケースクラスのコンストラクタの引数宣言をvalで行う
- toString、hashCode、equalsメソッドの実装を行う
このため、たった1行の記述で、リスト9のようにバリューオブジェクトを扱うことが可能です。