Dropped: private[this] and protected[this]
The private[this]
and protected[this]
access modifiers are deprecated and will be phased out.
Previously, these modifiers were needed for
- avoiding the generation of getters and setters
- excluding code under a
private[this]
from variance checks. (Scala 2 also excludesprotected[this]
but this was found to be unsound and was therefore removed). - avoiding the generation of fields, if a
private[this] val
is not accessed by a class method.
The compiler now infers for private
members the fact that they are only accessed via this
. Such members are treated as if they had been declared private[this]
. protected[this]
is dropped without a replacement.
This change can in some cases change the semantics of a Scala program, since a private
val is no longer guaranteed to generate a field. The field is omitted if
- the
val
is only accessed viathis
, and - the
val
is not accessed from a method in the current class.
This can cause problems if a program tries to access the missing private field via reflection. The recommended fix is to declare the field instead to be qualified private with the enclosing class as qualifier. Example:
class C(x: Int):
private[C] val field = x + 1
// [C] needed if `field` is to be accessed through reflection
val retained = field * field