Scala getter/setter-最佳实践?

wlwcrazw  于 2023-04-21  发布在  Scala
关注(0)|答案(3)|浏览(122)

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

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

是否可以(根据scala命名约定)在字段名之前加上下划线?
谢谢大家。

fnvucqvd

fnvucqvd1#

Scala风格指南很好地涵盖了这一点。
对于属性的访问器,方法的名称应该是属性的名称。
Scala并不遵循Java的约定,Scala宣扬的观点是,一个调用者不应该能够分辨出一个字段访问和一个方法调用之间的区别,这意味着约定是给它们两者取相同的名字;因此减少了如果字段被改变为方法或反之亦然所需的代码改变量。

是否可以(根据scala命名约定)在字段名称之前加上下划线?

Scala的惯例是给那些我们想要私有的字段加上前缀,否则它们就和公共方法同名,或者给它加上后缀0。

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

然而,在这个例子中,额外的代码行是不必要的。这个约定的存在是为了让我们可以使用这个较短的版本,然后在以后需要的时候将其更改为更显式的版本,而不必在每个调用站点都进行更改。

var value:Int = 0
d7v8vwbk

d7v8vwbk2#

根据Scala docs
Scala不遵循Java约定,即在mutator和accessor方法前分别添加set/get。相反,使用以下约定:

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

示例:

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

0pizxfdo3#

统一存取原则Uniform Access Principle:“uniform access principle统一访问原则声明变量和无参数函数应该使用相同的语法进行访问。Scala支持这一原则,不允许在无参数函数的调用位置放置括号。因此,无参数函数定义可以更改为瓦尔,反之亦然,而不会影响客户端代码。”

相关问题