【问题标题】:Scala getters/setters - best practice?Scala getter/setter - 最佳实践?
【发布时间】:2014-11-18 15:50:07
【问题描述】:

我是 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 命名约定)在字段名称本身之前放置下划线?

谢谢。

【问题讨论】:

    标签: java scala naming-conventions


    【解决方案1】:

    Scala Style Guide 很好地涵盖了这一点。

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

    Scala 不遵循 Java 约定。 Scala 提倡调用者不应该区分字段访问和方法调用之间的区别的观点,这意味着约定是给它们两个相同的名称;从而减少将字段更改为方法所需的代码更改量,反之亦然。

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

    Scala 约定是为我们希望私有的字段加上前缀,否则它们与公共方法具有相同的名称,或者用零作为后缀。任何一种方法都是可以接受的。

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

    但是,在此示例中,不需要额外的行。存在约定,因此我们可以使用这个较短的版本,然后在以后/如果需要时将其更改为更明确的版本,而无需在每个调用站点进行更改。

    var value:Int = 0
    

    【讨论】:

    • 除此之外,Scala 默认对成员属性提供统一访问原则,无需显式编写代码。 Java 要求您了解/选择符合 UAP 约定,然后也编写代码。
    • 好吧,我不知道 Odersky 在设计这个噩梦时是怎么想的。这就像所有编程语言历史上最糟糕的语法和推荐。名称后的下划线作为二传手?简直不能再神秘了
    • @user219882 也许他想阻止使用setter?我完全同意这一点。
    • @user219882 绝对......更不用说当它是value_ = 它会给你一个编译错误filename.scala:12: error: ';' expected but '=' found
    【解决方案2】:

    根据Scala docs

    Scala 不遵循将 set/get 附加到 mutator 和 accessor 方法(分别)的 Java 约定。而是使用以下约定:

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

    例子:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 2014-11-03
      • 2017-09-07
      • 2020-04-04
      • 1970-01-01
      相关资源
      最近更新 更多