case classのコンパニオンオブジェクト

って書けるんですね
知らなかった・・・

コンパニオンケースクラス

case classでobjectが定義されてしまってできないと思っていた
コンパイラがすげーよ・・・

case class Foo(i:Int)
object Foo {
  def apply() = new Foo(0)
}
//scala> Foo
//res1: Foo.type = Foo$@61cc1457
//scala> Foo()
//res2: Foo = Foo(0)
//scala> Foo(1)
//res3: Foo = Foo(1)

さすがに同じapply定義すると怒られる

case class Foo(i:Int)
object Foo {
  def apply(i:Int) = new Foo(i)
}
//<console>:32: error: method apply is defined twice
//       case class Foo(i:Int)
//                  ^

case classのコンストラクタにデフォルト引数だと、objectが優先されるっぽい

case class Foo(i:Int=100)
object Foo {
  def apply()=new Foo(200)
}
//scala> Foo()
//res4: Foo = Foo(200)
どこで使えるのか?

case classはMVCでいうモデルで扱いやすい
case classのコンパニオンオブジェクトはモデル単体では済まない処理(サービス)について記述するのがよさそう

class UserModel(val name: String)
class UserService {
  //
}

だったのが、

case class User(name: String)
object User {
  //
}

と書くといい?