问题描述
我知道在类中将val / var标记为private [this]并提供没有val / var的类参数是相同的。
class ABC (x:Int){..}
class ABC {
private[this] x:Int = 100
}
在两种情况下,x只能由同一对象的构造函数和方法访问。我的理解正确吗?
谢谢!
解决方法
两者
import scala.reflect.runtime.universe._
reify{
class ABC(x: Int)
}.tree
和
reify {
class ABC(private[this] val x: Int)
}.tree
产生
{
class ABC extends AnyRef {
<paramaccessor> private[this] val x: Int = _;
def <init>(x: Int) = {
super.<init>();
()
}
};
()
}
和
reify{
class ABC {
private[this] val x: Int = 100
}
}.tree
产生
{
class ABC extends AnyRef {
def <init>() = {
super.<init>();
()
};
private[this] val x: Int = 100
};
()
}
所以您的问题的答案
在两种情况下,x只能由同一对象的构造函数和方法访问。
是肯定的。
您可以检查class ABC(x: Int)
是否确实创建了一个(private[this]
)字段,以确认您可以使用this
来访问它
class ABC(x: Int) {
this.x
}
但是必须强调的是,Scala规范并未指定x
中的class ABC(x: Int)
是 字段,还是不是 领域。这只是Scalac和Dotty编译器的当前行为。
Get the property of parent class in case classes
Disambiguate constructor parameter with same name as class field of superclass
Do scala constructor parameters default to private val?
我知道在类中将val / var标记为private [this]并提供没有val / var的类参数是相同的。
好吧,这不一样,因为使用class ABC(x: Int)
时,您有一个接受Int
的构造函数。