はい、それが普通だと思います。
ほとんどのクラスで、コンパニオン オブジェクトを作成して、初期化/検証ロジックを処理します。たとえば、コンストラクターでパラメーターの検証が失敗した場合に例外をスローする代わりに、コンパニオン オブジェクトの apply-method でOption
またはを返すことができます。Either
class X(val x: Int) {
require(x >= 0)
}
// ==>
object X {
def apply(x: Int): Option[X] =
if (x < 0) None else Some(new X(x))
}
class X private (val x: Int)
コンパニオン オブジェクトでは、不変オブジェクトのキャッシュなど、多くのロジックを追加できます。
メッセージも送信する必要がない場合、オブジェクトはインスタンス間でシグナルを送信するのにも適しています。
object X {
def doSomething(s: String) = ???
}
case class C(s: String)
class A extends Actor {
var calculateLater: String = ""
def receive = {
case X => X.doSomething(s)
case C(s) => calculateLater = s
}
}
オブジェクトのもう 1 つの使用例は、要素のスコープを縮小することです。
// traits with lots of members
trait A
trait B
trait C
trait Trait {
def validate(s: String) = {
import validator._
// use logic of validator
}
private object validator extends A with B with C {
// all members of A, B and C are visible here
}
}
class Class extends Trait {
// no unnecessary members and name conflicts here
}