我已经试了:
class Foo(bar: Int)
VS:
class Foo(private val bar: Int)
他们似乎有同样的表现,虽然我无法找到任何地方说(bar: Int)
扩展到(private val bar: Int)
,所以我的问题是,这些相同/相似?
在一个侧面说明,我一直在尝试使用-Xprint:typer
这些代码段和它们所产生相同的代码除了在第二个额外的线路。 我如何读取额外的行?
..
class Foo extends scala.AnyRef {
<paramaccessor> private[this] val bar: Int = _;
def <init>(bar: Int): this.Foo = {
Foo.super.<init>();
()
}
}
..
..
class Foo extends scala.AnyRef {
<paramaccessor> private[this] val bar: Int = _;
<stable> <accessor> <paramaccessor> private def bar: Int = Foo.this.bar;
def <init>(bar: Int): this.Foo = {
Foo.super.<init>();
()
}
}
..
bar: Int
这是几乎没有一个构造函数的参数。 如果这个变量没有除了构造函数的任何地方使用,但它仍然在那里。 不产生场。 否则private val bar
创建领域和价值bar
参数分配给它。 没有消气创建。
private val bar: Int
参数的这种声明将建立private val bar
与私人领域的getter。 此行为是与上述相同不管如果参数被构造(例如,在旁使用toString()
或没有)。
val bar: Int
同上,但斯卡拉般的吸气剂是公
bar: Int
万一班
当case类都参与其中,在默认情况下每个参数val
修改。
在第一种情况下, bar
仅仅是一个构造函数的参数。 由于主要构造是类本身的内容,它是在它访问,但仅从这很实例。 因此,它几乎等同于:
class Foo(private[this] val bar:Int)
在另一方面,在第二种情况下bar
是正常的私营领域,因此它是这个实例和其它实例访问Foo
。 例如,该编译罚款:
class Foo(private val bar: Int) {
def otherBar(f: Foo) {
println(f.bar) // access bar of another foo
}
}
并运行:
scala> val a = new Foo(1)
a: Foo = Foo@7a99d0af
scala> a.otherBar(new Foo(3))
3
但这并不:
class Foo(bar: Int) {
def otherBar(f: Foo) {
println(f.bar) // error! cannot access bar of another foo
}
}