1

在与我的私有不可变类构造函数以及辅助构造函数必须相互调用作为第一条语句的约束进行斗争时,在范围内没有任何其他类的情况下,我似乎被限制为我的实例化使用伴随对象,并且由于我的伴随对象必须访问主构造函数,我需要 private 关键字来定位包括该对象的范围。

现在,我的大脑在名称生成方面很薄弱,我试图通过将我的类放在伴随对象本身中来节省对伴随对象和类的封闭命名空间的需要,这样:

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)
//...

问题是Groupofprivate[Group]不引用对象,但仍然是类(使其多余)。

如何将该构造函数标记为在伴随对象级别可用,但不能在其外部使用?

PS:那个伴生对象已经让我头疼了,我什至宁愿只拥有这个类,在那里限定complexCompute,几个构造函数实现可能需要......

编辑:好的。就在添加标签时,我碰到了一个响铃的神经元,一个伴生对象可能对类的范围有一些特权。它可以访问其私有部分,因此我可以简单地将对象和类并排放置,而无需专门的封闭范围。但是,我坚持这个问题,既是对处理此类装箱案例范围界定的可能性方式的回应,也是对object Main {object Main {object Main...在类中只有构造函数而没有任何伴随对象的技术发表评论的机会。

4

2 回答 2

3

您的 Group 对象不是您的 Group 类的伴随对象,因为它们不在同一个命名空间中。

您不必为private修饰符提供范围。如果将其留空,则只能由此类及其伴随对象访问。

object Something {

  class Group private(x: Int, y: Int)
  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)
    }
  }
  val x = Group(5)

  // This line doesn't compile
  new Group(42, 45)
}
于 2014-12-05T19:29:56.083 回答
0

伴随对象的私有也可以从类中访问,所以我有另一个选项,关于我的根本问题:

object Group {
  private def computeX(z: Int) = z
  private def computeY(x: Int, z: Int) = x + z
  private def computeXY(z: Int) = {
    val x = computeX(z)
    (x, computeY(x, z))
  }
}
class Group private (x: Int, y: Int) {
  private def this(xy: (Int, Int)) = this(xy._1, xy._2)
  def this(z: Int) = this(Group.computeXY(z))
}
val group = new Group(5)

伴随对象使我的构造函数可以使用完整的私有范围,这让我呼吸得更好。在我的完整情况下,我确实也需要我想要私有的类型。我想,我被迫创建一个同伴来包含这个本地有用的范围的事实现在可能不那么重要了。然而,元组的使用使得它比 Dimitri 的选项更麻烦。

于 2014-12-05T22:24:36.190 回答