2017-03-17 98 views
0

從Groovy遷移到Scala以及到目前爲止愛Scala。我對Groovy深感遺憾的事情之一是,我可以在對象上定義屬性/字段,然後僅僅引用它們而不用其他類的getter。在沒有獲取者的情況下訪問Scala字段

例如,在Java:

public class Fizz { 
    private String buzz; 

    public Fizz(String buzz) { 
     super(); 

     setBuzz(buzz); 
    } 

    // Getters and setters for buzz 
} 

但在Groovy:

class Fizz { 
    String buzz 
} 

然後,我可以從不同的類引用buzz像這樣:

void someMethod(Fizz fizz) { 
    if(fizz.buzz == "gnarly!") { 
     ... 
    } 
} 

但是似乎斯卡拉不這樣做,你必須解決這個問題:

class Fizz(buzz : String) { 
    ... 
} 

def someMethod(fizz : Fizz) : Unit = { 
    if(fizz.getBuzz.eq("gnarly!")) { 
    ... 
    } 
} 

爲了使我的Scala代碼「更巧妙」(這一個用例)我在裏面加入一些我的Scala類的「幫手」的方法解決:

class Fizz(buzz : String) { 
    def buzz() : String = { this.buzz } 
} 

現在允許我訪問他們像這樣:

def someMethod(fizz : Fizz) : Unit = { 
    if(fizz.buzz.eq("gnarly!")) { 
    ... 
    } 
} 

我的問題:斯卡拉是否有任何其他機制/設備,讓我來完成上述所需的行爲withou不得不寫我所謂的「幫手方法」?

+1

請閱讀斯卡拉案例類 –

+0

不知道爲什麼這是downvoted。這是關於主題,不是一個騙局(鑑於我顯然是新來的Scala,可能不知道事情類案例或其他構造已經在此網站上查詢過),顯示研究,是一個[ SSCCE](http://sscce.org)。 – smeeb

回答

3

其實,它的確如此。看看這個nice的例子。根據您如何在主構造函數中聲明參數,您會得到以下行爲:

聲明Getter?二傳手?
----------- ------- -------
VAR是是
VAL是沒有
默認無無

這裏, default表示您按照實際情況聲明不帶valvar的類參數。因此,只需將val放在它的前面,您就可以公開訪問開箱即用的字段。

我希望這是有幫助的。

+0

謝謝@Bianca Tesila,但是這並不需要我在get參數前添加字段引用?那麼'fizz.getBuzz'?我正在尋找一種方法來寫'fizz.buzz'。 – smeeb

+0

不,當你調用'fizz.buzz'時,你實際上調用了內部創建的getter。所以除此之外你不需要任何東西。您可以檢查使用javap工具生成的內容。 –

相關問題