play2 で dbのmodelになんでcase classを使うの?

イシュー

  • scala の case classは、マッチングに使うクラスだが(だからcase)、dbのモデルにも使われる。
  • case classの何がいいか?

参考

case をつけて class宣言

  • case をつけて class宣言すると以下のメソッドとコンパニオンオブジェクトが自動生成される(マクロ?)
    • equals メソッド(case 比較用)
    • hashCode メソッド(比較する時に hash値を使う方が速い)
    • toString
    • canEqual
    • copy (値をコピーして値をインスタンスを生成)
    • product トレイト のミックスインメソッド(フィールドの個数、フィールドの値、クラス名の文字列)
    • apply (ファクトリーパターン)
    • unapply(unapplyを実装すると、match式の caseに使用できる)

参考

よさげなところ

  • getterが生成される(setterは生成されない)

    • 以下のcase classをつくっておくと、getId()クラスをつくらなくても、Todo.id でアクセスできる(便利!)

      case class Todo(id: Option[Long] = None, content: String)

  • apply, unapply が実装されるので、*の実装が楽

    def * = id.? ~ content <>(Todo.apply , Todo.unapply )

  • Option は、caseクラスなので値がない場合に、None(あればSome(値))を返す。

    • そもそも値がある場合のみ処理を行いたい場合は、match式すら必要ありません。Option#foreachでSomeの場合のみ処理を行わせることができます。nullチェック不要

参考