2014-09-24 34 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 = ... 
}