Scala构造函数参数
私有var构造函数参数和没有val/var的构造函数参数之间有什么区别?它们在范围/可见性方面是否相同 例:Scala构造函数参数,scala,scala-2.10,Scala,Scala 2.10,私有var构造函数参数和没有val/var的构造函数参数之间有什么区别?它们在范围/可见性方面是否相同 例: 是的,有两个重要的区别。首先是简单的一个:没有var或val关键字的构造函数参数是不可变的变量,它们的值不能在类的主体中更改 即使我们仅限于val关键字,但是private val和无关键字参数之间仍然存在差异。考虑以下事项: class Person(private val firstName: String, lastName: String) 如果我们使用javap-vperso
是的,有两个重要的区别。首先是简单的一个:没有
var
或val
关键字的构造函数参数是不可变的变量,它们的值不能在类的主体中更改
即使我们仅限于val
关键字,但是private val
和无关键字参数之间仍然存在差异。考虑以下事项:
class Person(private val firstName: String, lastName: String)
如果我们使用javap-vperson
查看编译后的类,我们将看到它只有一个字段,用于firstName
lastName
只是一个构造函数参数,这意味着它可能在类初始化后被垃圾收集,等等
编译器足够聪明,可以知道初始化后何时需要lastName
的值,在这种情况下,它将为它创建一个字段。考虑以下变化:
class Person(private val firstName: String, lastName: String) {
def fullName = firstName + " " + lastName
}
编译器可以告诉我们以后可能需要lastName
的值,如果我们再次检查javap
,我们将看到该类有两个字段(请注意,如果我们将fullName
定义为val
而不是def
,它将只有一个字段)
最后,请注意,如果我们将firstName
对象设为私有而不是类私有,则其工作原理与普通的无关键字构造函数参数完全相同:
class Person(private[this] val firstName: String, lastName: String)
这甚至适用于var
而不是val
:
class Person(private[this] var firstName: String, lastName: String)
这两个类都没有字段。有关对象私有访问的更多详细信息,请参见的第5.2节。作为补充,如果您的类是case类,则所有构造函数参数将自动成为公共字段
如果private关键字存在,编译器会抱怨它,对于没有val/var的参数,无论它们是否在任何def中使用,将为它们生成公共字段。检查这个问题:这有一个更好的解释:你是说在
def fullName
示例中,private val
和无关键字参数之间没有区别吗?@TravisBrown在2.13.2中都是class Person(private[this]val firstName:String)
和类人员(firstName:String)
生成字段private[this]val firstName:String
class Person(private[this] var firstName: String, lastName: String)