Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala构造函数参数_Scala_Scala 2.10 - Fatal编程技术网

Scala构造函数参数

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/var的构造函数参数之间有什么区别?它们在范围/可见性方面是否相同

例:


是的,有两个重要的区别。首先是简单的一个:没有
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)