众所周知,Scala会自动为任何公共字段生成getter和setter,并将实际字段变量设为私有.为什么它比公开场地更好?
web*_*ste 10
首先,保持字段公开允许客户端读取和写入字段.由于拥有不可变对象是有益的,我建议将字段设为只读(通过将其声明为"val"而不是"var",可以在Scala中实现).
现在回到你的实际问题.如果您需要的不仅仅是琐碎的版本,Scala允许您定义自己的setter和getter.这对于维护不变量非常有用.对于setter,您可能需要检查字段设置的值.如果你将场地公开,你就没有机会这样做.
这对于声明为"val"的字段也很有用.假设您有一个Array [X]类型的字段来表示类的内部状态.客户端现在可以获得对此数组的引用并对其进行修改 - 再次,您无法确保维护不变量.但由于您可以定义自己的getter,因此可以返回实际数组的副本.
当您在Java中创建引用类型"final public"的字段时,同样的参数适用 - 客户端无法重置引用但仍修改引用指向的对象.
相关说明:在Scala中通过getter访问字段看起来像直接访问字段.关于这一点的好处是它允许访问一个字段并调用一个没有参数的方法看起来像是同一个东西.因此,如果您决定不再在某个字段中存储值,而是在运行中进行计算,则客户端不必关心,因为它对他来说看起来是一样的 - 这称为统一访问原则
简而言之:统一访问原则.
您可以使用val从超类实现抽象方法.想象一下从一些想象的图形包中的以下定义:
abstract class circle {
def bounds: Rectangle
def centre: Point
def radius: Double
}
Run Code Online (Sandbox Code Playgroud)
有两个可能的子类,一个是圆形是根据边界框定义的,另一个是根据中心和半径定义的.由于UAP,实现的细节可以完全抽象出来,并且可以轻松更改.
还有第三种可能性:懒惰的vals.这些对于避免一次又一次地重新计算我们的圆的边界非常有用,但是很难想象如果没有统一访问原则可以实现多么懒的val.
| 归档时间: |
|
| 查看次数: |
734 次 |
| 最近记录: |