做斯卡拉构造函数的参数默认为私有VAL?(Do scala constructor paramete

2019-07-19 06:32发布

我已经试了:

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>();
    ()
  }
}
..

Answer 1:

bar: Int

这是几乎没有一个构造函数的参数。 如果这个变量没有除了构造函数的任何地方使用,但它仍然在那里。 不产生场。 否则private val bar创建领域和价值bar参数分配给它。 没有消气创建。

private val bar: Int

参数的这种声明将建立private val bar与私人领域的getter。 此行为是与上述相同不管如果参数被构造(例如,在旁使用toString()或没有)。

val bar: Int

同上,但斯卡拉般的吸气剂是公

bar: Int万一班

当case类都参与其中,在默认情况下每个参数val修改。



Answer 2:

在第一种情况下, 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
  }
}


文章来源: Do scala constructor parameters default to private val?