2014-09-24 74 views
3

我是Java SE/EE開發人員,但在Scala初學者。在Java中,當我有一些應該可以被其他代碼訪問的私有字段時,我使用經典風格的getter/setter的getX()/setX()。但是,不確定Scala如何。我注意到在Scala中,字段getter/setter的命名約定是使用與字段相同的名稱。因此,它是OK,您只需設置現場public,或者我應該用這種風格的getter/setter的?:斯卡拉getters/setters - 最佳實踐?

private var _value = ..... 
def value = _value 
def value_= (newVal:Int) = _value = newVal 

那是正確的(根據階的命名規則)把字段名本身之前下劃線?

謝謝。

回答

15

Scala Style Guide涵蓋了這個很好。

對於屬性的訪問器,方法的名稱應該是屬性的名稱。

Scala不遵循Java約定。 Scala提倡這樣一種觀點,即調用者不應該能夠區分字段訪問和方法調用之間的區別,這意味着該約定將賦予它們兩個相同的名稱;從而減少了將字段更改爲方法所需的代碼更改量,反之亦然。

是否可以(根據scala命名約定)在字段名稱之前加下劃線?

Scala約定是爲我們希望是私有的字段添加前綴,否則這些字段與公共方法具有相同的名稱,或者將其後綴爲零。這兩種方法都可以接受。

private var _value = ..... 
def value = _value 
def value_= (newVal:Int) = _value = newVal 

但是,考慮到這個例子,額外的行是不必要的。約定的存在使得我們可以使用這個較短的版本,然後在需要時/如果我們需要而不必在每個調用站點進行更改,則稍後將其更改爲更加明確的版本。

var value:Int = 0 
+0

另外此,斯卡拉提供*統一訪問原則上*默認成員屬性,而不必明確寫出的代碼。Java要求您知道/選擇符合UAP規範,然後編寫代碼。 – pds 2017-04-08 15:12:41

+0

我不知道奧德斯基在設計這個噩夢時想的是什麼。這就像所有編程語言歷史上最糟糕的語法和建議。在作爲二傳手的名字後下劃線?它不可能更神祕 – user219882 2018-02-22 08:40:12

4

按照Scala docs

Scala沒有遵循前面加上一系列的Java約定/獲取(分別)以增變和訪問方法。相反,使用以下約定:

  • 有關屬性訪問器,該方法的名稱應該是屬性的名稱。
  • 在某些情況下,在布爾存取器(例如isEmpty)上加上「is」是可以接受的。這應該只是在沒有提供相應的增變器的情況下。
  • 對於增變器,方法的名稱應該是附加「_ =」的屬性的名稱。

實施例:

class Foo { 
    def bar = ... 
    def bar_=(bar: Bar) { 
    ... 
    } 
    def isBaz = ... 
}