Scala 如何为默认构造函数参数定义访问器方法?
正在尝试为默认构造函数参数定义访问器方法,即:Scala 如何为默认构造函数参数定义访问器方法?,scala,Scala,正在尝试为默认构造函数参数定义访问器方法,即: class Person (age: Int) { def age: Int = this.age } 这显然会导致编译器错误:对重载定义的引用不明确,类型为=>Int的类Person中的方法年龄和类型为Int的类Person中的值年龄都与预期的类型Int匹配 在此上下文中,是否有方法区分成员方法名称和自动生成的成员值名称 当然,可以更改任一标识符的名称,但在这种情况下,是否有办法实际指定引用哪个标识符?只需将“val”放在要作为实例属性
class Person (age: Int) {
def age: Int = this.age
}
这显然会导致编译器错误:对重载定义的引用不明确,类型为=>Int的类Person中的方法年龄和类型为Int的类Person中的值年龄都与预期的类型Int匹配
在此上下文中,是否有方法区分成员方法名称和自动生成的成员值名称
当然,可以更改任一标识符的名称,但在这种情况下,是否有办法实际指定引用哪个标识符?只需将“val”放在要作为实例属性公开的构造函数参数前面。使用
class Person (val age: Int)
如果你只是想要一个getter或者
class Person (var age: Int)
如果您还需要一个setter。以上答案与统一访问原则相比非常好。如果您有或需要Java风格的getter和setter,也可以使用BeanProperty注释
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约定来设置值 为了完整性和扩展前面的答案,这里还介绍了一些技巧 总而言之,我总是从一个不可变的值开始:
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
感谢所有其他答案,它们确实是正确的,而且来得更快。谢谢!我自己就想出来了。:-)但是如果我想覆盖默认的访问器呢?我想我仍然需要重命名参数?是的,您需要重命名参数(例如
age0
),然后定义访问器def age={Math.abs(age0)