2015-05-29 97 views
4

我是Scala的新用Java背景。scala如何對待伴侶對象?

java當我們想分享不同類對象之間的任何領域。我們宣佈該字段爲static

class Car { 
static NO_Of_TYRES = 4; 
// some implementation. 
public int getCarNoOftyres(){ 
     NO_Of_TYRES; // although it's not a good practice to use static without class name 
        //but we can directly access static member in same class . 
    } 


} 

但在Scala中我們不能宣佈在class靜態字段,我們需要使用object(同伴對象)這一點。 在scala我們會做這樣的,

class Car { 
println(NO_Of_TYRES); // scala doesn't let us do that. gives error 
println(Car.NO_Of_TYRES);// this is correct way. 

} 

object Car { 
val NO_Of_TYRES: Int = 4; 
} 

我只是好奇,怎麼對待階同伴對象? 這兩個關鍵詞(class and object)是什麼不同造成的? 爲什麼scala不讓我們直接在課堂上訪問NO_Of_TYRES

+3

您可以在文件級別或類內部導入Car._'並根據我的知識使用'NO_OF_TYRES' – Daenyth

+0

,Companaion對象必須位於同一個文件中?仍然需要導入我不這麼認爲?我的問題是,scala如何處理關鍵字類和對象? –

+1

它需要在同一個文件中。 – Daenyth

回答

2

我想引用關於同一主題的另一個答案:What are the advantages of Scala's companion objects vs static methods?

第4.3節 Odersky的書Programming in Scala - Chapter 4 - Classes and Objects

斯卡拉把一切與他們的實例純對象見。在這個視圖中,一個java static成員不是任何實例的一部分,它生活在一個單獨的,不同的生活中。

利用關鍵字object和某些語法糖的技巧,可以實現相同的結果,但保持所述的原則:實例化該對象的單個實例並提供該實例的全局訪問點。

+0

謝謝。您提供的鏈接真的很有幫助。 –

3

播對象是單例類實例(和定義),只是爲了單記得在Java是或多或少:

class Foo { 
    private Foo() { } 
    /* boilerplate to prevent cloning */ 
    private static Foo instance = new Foo(); 
    public static Foo getInstance() { return instance; } 

    public int bar() { return 5; } 
} 

,然後調用該對象的方法欄:

Foo.getInstance().bar(); 

斯卡拉刪除所有這樣的樣板,並讓你創建等同的東西只是

object Foo { 
    def bar: Int = 5 
} 

並稱之爲你只需要

Foo.bar 

現在'object'和'companion object'有什麼區別?它實際上非常簡單 - 伴侶對象(所以對象在同一個文件中定義爲一個類,並且具有相同的名稱)可以訪問它的相關類專用字段和方法,這就是爲什麼scala作者決定它應該駐留在同一個文件中文件 - 所以對私有字段的引用與它們的聲明位於同一個文件中(除非使用反射魔法,否則我認爲它始終是Java和Scala中的情況)

+4

最重要的原因是您可以隨時向系統添加新代碼。如果您允許在* * *編譯單元中添加新的伴隨對象,則任何人都可以添加新的伴隨對象並通過訪問其私有對象來破壞類的封裝。兩個同伴都在同一個編譯單元中的要求確保了封裝被保留。換句話說,如果你有權訪問類的源文件,無論如何封裝都不在窗口中。 –

+0

感謝您的幫助。 –

1

正如您所指出的,Scala不能具有靜態變量或Java中已知的方法。相反,有單身人士對象,這些對象是用關鍵字object聲明的。在這個對象中調用一個方法就像在Java中調用一個靜態方法,不同的是你調用單例對象的方法。

如果此對象具有相同名稱的classtrait,則它稱爲類/特徵的伴隨對象。伴隨對象必須在類/特徵的相同源文件中定義。伴侶對象不同於其他對象,因爲它具有對其他對象不具有的相關類/特徵的訪問權限。特別是它可以訪問類/特質中私有的方法和字段。

+0

感謝您的幫助。 –

相關問題