伴侶對象是你在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)
}
正常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-27 01:35:29