プライベートな不変クラス コンストラクターと、補助コンストラクターが最初のステートメントとして相互に呼び出さなければならないという制約と戦っている間、スコープ内のクラスから他に何もないため、インスタンス化にコンパニオン オブジェクトを使用するように制約されているようです。コンパニオン オブジェクトはメイン コンストラクターにアクセスする必要があります。そのオブジェクトを含むスコープを対象とするプライベート キーワードが必要です。
さて、私の脳は名前生成に弱いので、次のようにクラスをコンパニオン オブジェクト自体の中に配置することで、そのコンパニオン オブジェクトとクラスの両方を囲む名前空間の必要性を救おうとしています。
object Group {
private def complexComputeX(z: Int) = z
private def complexComputeY(x: Int, z: Int) = x + z
def apply(z: Int) = {
val x = complexComputeX(z)
val y = complexComputeY(x, z)
new Group(x, y)
}
class Group private[Group](x: Int, y: Int) {
//...
}
}
val x = Group(5)
//...
問題は、Group
ofprivate[Group]
がオブジェクトを参照するのではなく、クラスを参照することです (余計なものになっています)。
そのコンストラクターをコンパニオン オブジェクト レベルで使用できるようにタグ付けするにはどうすればよいですか?
PS:そのコンパニオンオブジェクトはすでに私に頭痛の種を与えておりcomplexCompute
、いくつかのコンストラクターの実装が必要になる可能性のあるクラスをエンスコープすることさえ望んでいたでしょう...
編集:わかりました。タグを追加しているときに、コンパニオン オブジェクトがクラスのスコープに対してなんらかの権限を持っている可能性があることを知らせるニューロンにぶつかりました。プライベート パーツにアクセスできるため、専用の囲みスコープなしでオブジェクトとクラスを並べて配置できます。object Main {object Main {object Main...
ただし、このようなボクシング ケースのスコーピングを処理する可能性のある方法についての回答と、コンパニオン オブジェクトを使用せずにクラスにコンストラクターのみを含める手法についての発言の可能性の両方について、質問を維持します。