如何访问和改变scala中的私有字段?

时间:2011-06-27 19:09:34

标签: scala

我有类似的东西:

class Address(private var street:String, private var city: String, private var postCode: String) extends Model

当我尝试做的时候:

address = new Address(....)
address.city = "changed"

我收到编译错误。 那么解决方案是什么?请注意,这些字段必须保密。

还有一种快捷语法,而不是在类中的所有字段都是私有时重复关键字private吗?

2 个答案:

答案 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是一个已知问题,但目前没有努力改善这种情况。