2013-02-27 66 views
0

所以我是新來的斯卡拉(幾乎沒有Java經驗)。我想到我理解OOP,抽象,但無視這一點。我的問題 - 與「method name qualification when using a companion object」類似 - 是關於何時Scala專業人員會考慮實現類伴隨對象模式?何時使用/製作伴侶對象?

從上面引用的問題來看,並不清楚伴侶對象是用來存儲類的「內部使用」的方法(例如,海報希望使用^,在對象中定義,在類中定義) 。因此,我不想將伴侶對象視爲伴侶類可以使用的方法的「容器」,因爲這顯然不是真的...

如果這是一個模糊的問題,我很抱歉:我只是想要知道使用這些傢伙的正確方法。

+0

伴侶類可以訪問伴侶對象的私人成員,因此您可以在其中使用「內部使用」定義並使其成爲私人對象。 – 2013-02-27 01:35:29

回答

1

伴侶對象是你在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); 
} 

同伴對象基本上是讓你連接到你的類名稱的命名空間是不特定類的特定實例。

+0

你介意給我一個例子嗎? /就像我說的,我對Java一無所知,更不用說靜態方法了。 – StevieP 2013-02-27 05:06:30

+0

對不起,我錯過了關於你沒有Java經驗的部分。我很難避免試圖用java靜態上下文來定義它:) – 2013-02-27 05:26:43

+0

對「靜態上下文」的快速解釋是,你經常希望有一個與數據類型相關的函數,但它不屬於「到特定的實例。對於工廠方法(以上適用),顯然你還沒有實例調用該函數。但是,也可以說'Complex.average(num1,num2,...)',您將它應用於多個實例。伴隨對象提供了一個名稱空間來將這些函數與數據類型一起收集起來。編譯器還將搜索伴隨對象以進行隱式轉換 - 將函數轉換爲此類型的其他類型的數據。 – 2013-02-27 06:22:54