何时使用/制作伴侣对象?

时间:2013-02-27 00:04:15

标签: oop scala styles

所以我是Scala的新手(几乎没有java经验)。我思考我完全理解OOP,但忽略了这一点。我的问题 - 与“method name qualification when using a companion object”类似 - 是关于什么时候Scala pro会想到实现类 - 伴随对象模式?

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

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

1 个答案:

答案 0 :(得分:1)

Companion对象对于在Java中使用静态方法的内容非常有用...

一个非常常见的用途是在随播广告对象中定义apply()方法,这样用户就可以使用MyObject(arg, arg)作为new MyObject(arg, arg)的简写。

伴随对象也是放置隐式defs之类的好地方。

我最近一直在我的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);
}

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