2016-11-17 46 views
5

我對這兩段代碼之間有什麼區別有疑問。Scala在類中定義方法而不是在伴隨對象中有什麼區別

顯而易見的是,如果方法是寫在類中,您必須實例化類,而如果它在伴隨對象中,則不需要這樣做。

但是,還有其他的區別嗎?哪些是好處和缺點?

在類

class Hello { 
    def hello = println("Hello world") 
} 

object Hello { 
    def main(args: Array[String]) { 
    val instance = new Hello() 
    instance.hello 
    } 
} 

定義一個方法在同伴對象

class Hello { 

} 

object Hello { 

    def hello = println("Hello world") 

    def main(args: Array[String]) { 
    this.hello 
    } 
} 
+3

一個區別:對象,和它們的方法,不能被繼承或覆蓋。 – jwvh

+3

當一個類被實例化時,方法沒有被分配,所以這裏沒有重複。您仍然需要爲實例本身分配內存。 –

+0

@VictorMoroz謝謝你,是我不好,我會編輯的問題,從Odersky的書'運行時留出一些內存來保存對象的state'的形象,意味着分配僅供@jwvh我學會領域 – agusgambina

回答

7

如果你還記得的Scala從Java來定義一個方法,它可能使更多的意義。在Java中,有隻有是一個類,它有static方法,不以一個實例依賴於任何領域(但可以讀取static場)和普通(非靜態,實例級)的方法。區別在於「SomeType通用的功能,特別是沒有實例的功能」和「需要特定實例狀態的功能」之間的區別。前者是Java中的static方法,後者是實例方法。在Scala中,所有static部件都應該在object中,其中實例級別爲valdef。 例如:

object MyNumber { 
    // This does not depend on any instance of MyNumber 
    def add(c: Int, b: Int): Int = c + b 
} 
class MyNumber(a: Int) { 
    // This depends on an instance of MyNumber 
    def next: Int = a + 1 
} 
+2

這。事實上,恕我直言,最好的做法是始終注意那些實際上不使用實例成員的類成員,並將它們移動到靜態夥伴對象中。 – Yawar

+1

@Yawar除非您想在子類中覆蓋它們,否則請檢查例如類型類模式。 –

+0

@VictorMoroz,我認爲在這些模式中,先驗的理解是我們必須以某種方式做事。不過,好點。 – Yawar

相關問題