はい、私はそれが正常だと言います。
ほとんどのクラスでは、そこにいくつかの初期化/検証ロジックを処理するためのコンパニオンオブジェクトを作成します。
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)
コンパニオンオブジェクトには1がの多くを追加することができます。代わりに、パラメータの検証が失敗した場合は、コンストラクタで例外をスローする例については、仲間内Option
またはEither
が適用法オブジェクトを返すことが可能です不変オブジェクト用のキャッシュなどの追加ロジック。
オブジェクトはまた、メッセージを送信する必要がない場合は、インスタンス間の信号を送信するのに適しています:オブジェクトのための
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
}
}
別のユースケースは、要素の範囲を削減することである。
// 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
}
状態が無ければ、なぜオブジェクトであり、単に関数ではないのですか? – RonaldBarzell
あなたは何かの中に関数を置く必要はありません、これは私の質問です。私は関連する機能をたくさん持っています。オブジェクトの内部にあり、単にコンテナとして機能します。これはScalaでベストプラクティスとみなされるかどうかです。 – monkjack
よろしいですか?私は誤解しました。説明をありがとうございます。 – RonaldBarzell