我有类似的东西:
class Address(private var street:String, private var city: String, private var postCode: String) extends Model
当我尝试做的时候:
address = new Address(....)
address.city = "changed"
我收到编译错误。 那么解决方案是什么?请注意,这些字段必须保密。
还有一种快捷语法,而不是在类中的所有字段都是私有时重复关键字private吗?
答案 0 :(得分:18)
这里似乎存在根本的误解。 Scala中的所有字段都是私有的。它不仅是默认值,也不是可选的。
例如,假设你有这个:
class Address(var street: String)
存储street
的字段是私有。说你这样做:
val x = new Address("Downing")
println(x.street)
此代码不直接访问street
的私有字段。 x.street
是 getter方法。
说你这样做:
x.street = "Boulevard"
此代码不会直接修改street
的私有字段。 x.street =
实际上是方法x.street_=
,它是 setter方法。
您无法直接访问Scala中的字段。一切都是通过吸气剂和制定者完成的。在Scala中,每个字段都是私有的,每个字段都有getter,每个var
都有setter。
答案 1 :(得分:5)
您可以像这样定义访问者和变更者:
class Address(private var _street: String, private var _city: String, private var _postCode: String){
def street = _street
def street_=(street: String) = _street = street
def city = _city
def city_=(city: String) = _city = city
def postCode = _postCode
def postCode_=(postCode: String) = _postCode = postCode
}
需要重命名字段(可能与命名参数冲突)以及构造函数在实例化类时忽略mutator是一个已知问题,但目前没有努力改善这种情况。