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 { // }
と書くといい?