我可以在Scala中声明该类中的伴侣对象吗?

问题描述:

虽然与我的私有不可变类构造函数以及辅助构造函数必须作为第一条语句互相调用的约束作斗争,但没有任何其他类来自作用域中的类,我似乎被约束为我的实例化使用伴随对象,并且因为我的伴侣对象必须访问主构造函数,所以我需要private关键字来定位包含该对象的作用域。我可以在Scala中声明该类中的伴侣对象吗?

现在,我的大脑是名代弱,我想通过把班里的同伴中的对象本身保存一个封闭的命名空间都那个伴侣对象和类的需求,这种方式:

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

问题是的private[Group]没有引用该对象,但仍然是该类(使其成为多余的)。

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

PS:那个伴侣对象已经让我头疼,我甚至宁愿刚才的类,EN-作用域那里complexCompute,这几个构造函数的实现可能需要...

编辑:好的。就在添加标签时,我碰到一个神经元,我发现伴侣对象可能对类的范围有一些特权。它可以访问它的私有部分,所以我可以在没有专门的封闭范围的情况下简单地拥有对象和类。然而,我保持这个问题,对于可能的方式来处理这样的拳击案例范围的回应object Main {object Main {object Main...以及关于仅具有没有任何伴随对象的类中的构造函数的技术的评论的机会。

+0

更改了原来的问题“我们如何引用Scala中的外部范围?”。如果我找到另一个尝试的理由(我敢打赌,当层级具有相同的名称时,没有办法精确指定私有层面),我想我会单独询问它。 – Nirvana 2014-12-13 22:05:42

您的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) 
} 
+0

啊,对,谢谢。就像我发布我的编辑一样。我仍然有兴趣知道是否可以处理具有相同名称的嵌套关卡。 – Nirvana 2014-12-05 19:36:08

同伴对象的私人也可从类访问,所以我有这样的其他选项,关于我的根的问题:

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) 

那同伴对象进行提供一个完整的privatable范围从我的构造函数让我呼吸更好。在我的全部案例中,我确实也需要我想要的私人类型。我想,现在我*创建一个同伴来包含这个本地有用的范围可能并不那么重要。 但是,元组的使用使得它比Dimitri的选项更麻烦。