代码之家  ›  专栏  ›  技术社区  ›  Vlad Gudim nuriaion

如何定义默认构造函数参数的访问器方法?

  •  8
  • Vlad Gudim nuriaion  · 技术社区  · 14 年前

    尝试为默认构造函数参数定义访问器方法,即:

    class Person (age: Int) {
        def age: Int = this.age
    }
    

    这显然会导致编译器错误: 对重载定义的引用不明确,类型为int的class person中的方法age和类型为int的class person中的值age都与预期的类型int匹配

    在此上下文中,是否有方法区分成员方法名和自动生成的成员值名?

    当然,可以更改任一标识符的名称,但是在这个场景中,是否有一种方法可以实际指定引用哪个标识符?

    4 回复  |  直到 10 年前
        1
  •  16
  •   Randall Schulz    14 年前

    只需将“val”放在要作为实例属性公开的构造函数参数前面。

        2
  •  6
  •   Vlad Gudim nuriaion    14 年前

    使用

    class Person (val age: Int)
    

    如果你只是想要一个吸气剂或者

    class Person (var age: Int)
    

    如果你还想要个二传手。

        3
  •  3
  •   Aaron    14 年前

    以上答案与统一访问原则是很好的。如果您有或需要Java风格的吸收器和设置器,您也可以使用BeaNeWork注释。

    class Person(@scala.reflect.BeanProperty var age: Int)
    

    这将导致创建以下方法:

    def getAge: Int = age
    def setAge(age: Int) = this.age = age
    

    如果将beanproperty用于val而不是var,则不会创建setter,只创建getter。

    另一个警告是,不能从scala内部调用setter方法。相反,您应该使用统一访问的标准scala约定来设置值。

        4
  •  1
  •   Daniel Langdon    10 年前

    为了完整性和扩展前面的答案,还介绍了一些技巧 here .

    class Person (val age: Int)
    

    然后,如果您发现需要改变值(或者提前知道),请切换到:

    class Person (var age: Int)
    

    然后,如果需要在get或set上验证或执行其他计算,请重命名变量并构建模仿原始命名的访问器,无需重构其余代码:

    class Person(var _age: Int)
    {
       def age =
       {
          println("age requested")
          _age
       }
       def age_=(newAge: Int) =
       {
          assert(newAge > 0)
          println(s"age changed from ${_age} to $newAge")
          _age = newAge
       }
    }
    

    当然,如果不需要在其中进行操作,可以简化setter或getter。

    所有其他答案都是正确的,而且来得更快。