繁体   English   中英

Scala构造函数参数

[英]Scala Constructor Parameters

私有var构造函数参数和没有val / var的构造函数参数之间有什么区别? 它们的范围/可见度是否相同?

例如:

class Person(private var firstName:String, lastName:String)

是的,有两个重要的区别。 首先是简单的:没有varval关键字的构造函数参数不是可变变量 - 它们的值不能在类的主体中更改。

即使我们将自己局限于val关键字, private val和无关键字参数之间仍然存在差异。 考虑以下:

class Person(private val firstName: String, lastName: String)

如果我们用javap -v Person查看编译的类,我们会看到它只有一个字段,对于firstName lastName只是一个构造函数参数,这意味着它可以在初始化类之后进行垃圾收集等。

编译器足够聪明,可以知道初始化后何时需要lastName的值,并且在这种情况下它将为它创建一个字段。 请考虑以下变体:

class Person(private val firstName: String, lastName: String) {
  def fullName = firstName + " " + lastName
}

编译器可以告诉它以后可能需要lastName的值,如果我们再次检查javap ,我们会看到该类有两个字段(请注意,如果我们将fullName定义为val而不是def ,那么它就是只有一个字段)。

最后,请注意,如果我们使firstName object-private而不是class-private ,它的工作方式与普通的无关键字构造函数参数完全相同:

class Person(private[this] val firstName: String, lastName: String)

这甚至可以使用var而不是val

class Person(private[this] var firstName: String, lastName: String)

这两个类都没有字段。 有关对象 - 私有访问的更多详细信息,请参阅语言规范的第5.2节。

作为补充,如果您的类是一个案例类,所有构造函数参数将自动为公共字段。

编译器会抱怨private关键字(如果存在),对于没有val / var的参数,无论是否在任何defs中使用它们,都会为它们生成公共字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM