ケースクラス(case class )を宣言すると、ふつうのクラス(class)宣言に加えて、以下のものが追加で生成される。
- プライマリコンストラクタ引数を公開する(クラス宣言の引数に val をつけたように動作する)
- インスタンス同士の同値比較ができるように、equals()、hashCode()、canEqual()が定義される
- 型とプライマリコンストラクタ引数を使った toString() が定義される
- コンパニオンオブジェクトに apply() が定義される
ちょっと試してみよう。
scala> case class Point(x: Int, y: Int) defined class Point
プライマリコンストラクタ引数が公開されるので、x や y フィールドにアクセスできる。
scala> val p1 = new Point(1, 3) p1: Point = Point(1,3) scala> p1.x res0: Int = 1 scala> p1.y res1: Int = 3
コンパニオンオブジェクトに apply() が定義されるので、new キーワードなしでインスタンスを生成できる。
scala> val p2 = Point(1, 3) p2: Point = Point(1,3)
すでに上の実行例で出てきているけど、toString() で見やすい形で出力される。
scala> p1.toString() res2: String = Point(1,3)
同値比較。
scala> p1.equals(p2) res3: Boolean = true
ハッシュコード。これはオブジェクトごとに一意に決まるハッシュ値みたいなものかな。
scala> p1.hashCode() res4: Int = -1062267453 scala> p2.hashCode() res5: Int = -1062267453
別のオブジェクトでも同値だとハッシュコードも同じになるみたいだ。
hasEqual() は使い方がわからなかった。