私有var构造函数参数和没有val/var的构造函数参数之间有什么区别?它们的范围/可见度是否相同?
例如:
class Person(private var firstName:String, lastName:String)
Run Code Online (Sandbox Code Playgroud)
Tra*_*own 28
是的,有两个重要的区别.首先是简单的:没有var或val关键字的构造函数参数不是可变变量 - 它们的值不能在类的主体中更改.
但是,即使我们将自己局限于val关键字,仍然存在private val与无关键字参数之间的差异.考虑以下:
class Person(private val firstName: String, lastName: String)
Run Code Online (Sandbox Code Playgroud)
如果我们看一下编译的类javap -v Person,我们会看到它只有一个字段firstName.lastName只是一个构造函数参数,这意味着它可以在初始化类之后进行垃圾收集等.
编译器足够聪明,可以知道lastName初始化后何时需要它的值,并且在这种情况下它将为它创建一个字段.请考虑以下变体:
class Person(private val firstName: String, lastName: String) {
def fullName = firstName + " " + lastName
}
Run Code Online (Sandbox Code Playgroud)
编译器可以告诉它可能需要lastName稍后的值,如果我们javap再次检查,我们会看到该类有两个字段(注意,如果我们定义fullName为a val而不是a def,它只有一个字段) .
最后,请注意,如果我们使firstName 对象私有而不是类私有,它的工作方式与普通的无关键字构造函数参数完全相同:
class Person(private[this] val firstName: String, lastName: String)
Run Code Online (Sandbox Code Playgroud)
这甚至可以用于var代替val:
class Person(private[this] var firstName: String, lastName: String)
Run Code Online (Sandbox Code Playgroud)
这两个类都没有字段.有关对象 - 私有访问的更多详细信息,请参阅语言规范的第5.2节.
| 归档时间: |
|
| 查看次数: |
10626 次 |
| 最近记录: |