已弃用:private[this] 和 protected[this]
private[this]
和 protected[this]
访问修饰符已弃用,并将逐步淘汰。
以前,这些修饰符是必需的,用于
- 避免生成 getter 和 setter
- 从方差检查中排除
private[this]
下的代码。(Scala 2 也排除protected[this]
,但发现这并不健全,因此已删除)。 - 如果
private[this] val
未被类方法访问,则避免生成字段。
编译器现在推断private
成员只能通过this
访问的事实。此类成员将被视为已声明为private[this]
。protected[this]
将被删除,不会替换。
此更改在某些情况下可能会改变 Scala 程序的语义,因为private
val 不再保证会生成字段。如果以下情况,则会省略该字段:
val
只能通过this
访问,并且val
未从当前类中的方法访问。
如果程序尝试通过反射访问丢失的私有字段,这可能会导致问题。建议的解决方法是将字段声明为限定私有,并使用封闭类作为限定符。示例
class C(x: Int):
private[C] val field = x + 1
// [C] needed if `field` is to be accessed through reflection
val retained = field * field