1

所以我是 Scala 的新手(并且 Java 经验几乎为零)。我以为我抽象地理解了 OOP,但忽略了这一点。我的问题——与“使用伴生对象时的方法名称限定”类似——是关于 Scala 专业人士何时会考虑实现类伴生对象模式?

从上面提到的问题来看,尚不清楚伴生对象是否旨在存储类“内部使用”的方法(例如,发布者想要使用 ^,在对象中定义,在 / 中,在类中定义)。所以,我不想将伴生对象视为伴生类可以使用的方法的“容器”,因为这显然不是真的......

如果这是一个模糊的问题,我很抱歉:我只是想知道使用这些家伙的正确方法。

4

1 回答 1

4

伴生对象对于您在 Java 中使用静态方法的用途很有用...

一个非常常见的用途是apply()在伴随对象中定义一个方法,它使用户能够MyObject(arg, arg)使用new MyObject(arg, arg).

伴随对象也是放置隐式定义等内容的好地方。

我最近一直在我的 akka 应用程序中使用伴随对象作为放置特定于主管参与者及其子级的消息案例类的地方,但我不一定希望该子系统之外的代码直接使用。


这是一个简单的例子:

class Complex(real:Double, imag:Double) {
    def +(that:Complex):Complex = Complex(this.real + that.real, this.imag + that.imag)
    // other useful methods
}

// the companion object
object Complex { 
    def apply(real:Double, imag:Double) = new Complex(real, imag)

    val i = Complex(0, 1)

    implicit def fromInt(i:Int) = Complex(i, 0)
}

实例化新的 Complex 对象的正常 OOP 方法是new Complex(x, i). 在我的同伴对象中,我定义了函数apply,给我们一个语法糖,让我们可以编写Complex(x, i). apply是一个特殊的函数名,当您直接调用对象时调用它,就好像它是一个函数一样(即Complex())。

我还有一个名为 的值i,它的计算结果为Complex(0, 1),它为我提供了使用通用复数的简写i

这可以在 Java 中使用静态方法来完成,例如:

public static Complex i() {  
    return new Complex(0, 1);
}

伴随对象本质上为您提供了一个附加到您的类名的命名空间,该命名空间并不特定于您的类的特定实例。

于 2013-02-27T00:14:29.170 回答