private[this] vs private
There is a case where private[this]
is required to make code compile. This has to do with an interaction of variance notation and mutable variables. Consider the following (useless) class:
class Holder[+T] (initialValue: Option[T]) {
// without [this] it will not compile
private[this] var value = initialValue
def getValue = value
def makeEmpty { value = None }
}
So this class is designed to hold an optional value, return it as an option and enable the user to call makeEmpty
to clear the value (hence the var). As stated, this is useless except to demonstrate the point.
If you try compiling this code with private
instead of private[this]
it will fail with the following error message:
error: covariant type T occurs in contravariant position in type Option[T] of value value_= class Holder[+T] (initialValue: Option[T]) {
This error occurs because value is a mutable variable on the covariant type T (+T) which is normally a problem unless marked as private to the instance with private[this]
. The compiler has special handling in its variance checking to handle this special case.
So it's esoteric but there is a case where private[this]
is required over private
.
I don't think it matters too much, since any changes will only touch one class either way. So the most important reason to prefer private
over protected
over public
doesn't apply.
Use private[this]
where performance really matters (since you'll get direct field access instead of methods this way). Otherwise, just settle on one style so people don't need to figure out why this property is private
and that one is private[this]
.
private var name
is accessible from any method of the class Dummy
(and its companion object Dummy
).
private[this] var name
is accessible from methods of this
object only, not from other objects of class Dummy
.