Scala的构造函数参数默认为私有的val?

我已经试了:

class Foo(bar: Int) 

VS:

 class Foo(private val bar: Int) 

他们似乎performance一样,虽然我找不到任何地方说(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

这几乎不是一个构造函数参数。 如果这个variables不在构造函数的任何地方使用,它仍然存在。 没有字段生成。 否则,将创buildprivate val bar字段,并为其分配bar参数的值。 没有getter被创build。

private val bar: Int

这样的参数声明将与私有的getter一起创buildprivate val bar字段。 这个行为和上面的一样,不pipe参数是在构造函数旁边使用的(例如在toString() )。

val bar: Int

和上面一样,但是Scala类的getter是公开的

bar: Int在案例类

当涉及案例类时,默认情况下每个参数都有val修饰符。

在第一种情况下, bar只是一个构造函数参数。 由于主要构造函数是类本身的内容,所以可以在其中访问,但只能从这个实例中获取。 所以它几乎相当于:

 class Foo(private[this] val bar:Int) 

另一方面,在第二种情况下,它是一个普通的私有字段,所以它可以被这个实例 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 } }