伴生对象对于您在 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);
}
伴随对象本质上为您提供了一个附加到您的类名的命名空间,该命名空间并不特定于您的类的特定实例。