Scala的getter/setter - 最佳实践?

13

我是Java SE/EE开发人员,但在Scala方面是初学者。在Java中,当我有一些私有字段应该对其他代码可访问时,我使用getX()/setX()的经典风格来进行getter/setter操作。然而,我不确定Scala是否也适用这种方式。我注意到,在Scala中,获取器/设置器的命名惯例是使用与字段相同的名称。那么,直接将字段设置为public是否可行,还是应该使用这种getter/setter的方式呢?

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

根据 Scala 命名规范,在字段名之前加下划线是否可以?

谢谢。

3个回答

37

Scala风格指南很好地解释了这个问题。

对于属性的访问器,方法名应该和属性名相同。

Scala不遵循Java的惯例。Scala提倡的观点是调用者不能区分字段访问和方法调用的区别,这意味着惯例是给它们相同的名称;从而减少当一个字段被更改为一个方法或反之时所需的代码更改量。

根据Scala命名约定,在字段名前面加下划线是否可以?

Scala惯例是在想要被声明为私有的字段前缀添加下划线,否则与公共方法同名,或在其后缀添加零。这两种方式都是可接受的。

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

然而,鉴于这个例子,多余的行并不是必要的。这种约定存在的意义在于我们可以使用这个更短的版本,然后在需要时将其更改为更明确的版本,而无需在每个调用点进行更改。

var value:Int = 0

此外,Scala 默认提供了统一访问原则来访问成员属性,无需显式编写代码。而 Java 则需要你知道/选择符合 UAP 约定并编写代码。 - pds
13
我不知道Odersky在设计这个噩梦时在想什么。这就像编程语言历史上最糟糕的语法和建议。在名称后面加下划线作为setter?这简直不能更加晦涩。 - user219882
@user219882 或许他想要阻止使用setter方法?我完全同意这一点。 - th0masb
@user219882 当然没问题,更何况当你使用 value_ = 时,它会给出编译错误 filename.scala:12: error: ';' expected but '=' found - Romeo Sierra

7
根据Scala文档的说明:

Scala不遵循Java约定,即在改变器和访问器方法中分别添加set/get前缀。相反,使用以下约定:

  • 对于属性的访问器,方法的名称应该是属性的名称。
  • 在某些情况下,可以在布尔类型的访问器上添加“is”(例如isEmpty)。只有在没有提供相应的改变器时才应这样做。
  • 对于改变器,方法的名称应该是属性的名称,后面加上“_=”。

示例:

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接