Scala getters/setters - 最佳实践?

2022-09-05 00:07:02

我是Java SE / EE开发人员,但Scala的初学者。在Java中,当我有一些私有字段应该被其他代码访问时,我使用/经典的getters/setters风格。但是,不知道Scala怎么样。我注意到,在 Scala 中,字段的 getter/setter 的命名约定是使用与字段相同的名称。那么,是否可以简单地设置字段,或者我应该使用这种风格的 getter/setter?getX()setX()public

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

是否可以(根据 scala 命名约定)在字段名称本身之前放置下划线?

谢谢。


答案 1

Scala风格指南很好地涵盖了这一点。

对于属性的访问器,方法的名称应为属性的名称。

Scala不遵循Java约定。Scala提倡这样一种观点,即调用方不应该能够分辨字段访问和方法调用之间的区别,这意味着约定是给它们提供相同的名称;因此,如果将字段更改为方法,则减少所需的代码更改量,反之亦然。

是否可以(根据 scala 命名约定)在字段名称本身之前放置下划线?

Scala 约定是将我们想要私有的字段作为前缀,否则这些字段与公共方法具有相同的名称,或者用零对其进行后缀。这两种方法都是可以接受的。

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

但是,给定此示例,不需要额外的行。该约定的存在是为了我们可以使用此较短的版本,然后在以后根据需要将其更改为更明确的版本,而无需在每个调用站点上进行更改。

var value:Int = 0

答案 2

根据Scala文档

Scala 不遵循 Java 的约定,即分别在 set/get to mutator 和 accessor 方法之前。相反,将使用以下约定:

  • 对于属性的访问器,方法的名称应为属性的名称。
  • 在某些情况下,在布尔访问器上预置“”是可以接受的(例如 isEmpty)。仅当未提供相应的突变体时,才应如此。is
  • 对于赋值函数,方法的名称应为附加了“_=”的属性名称。

例:

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