加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala构造函数参数

发布时间:2020-12-16 09:32:01 所属栏目:安全 来源:网络整理
导读:private var constructor参数和没有val / var的构造函数之间有什么区别?在范围/可见度方面是否相同? 例如: class Person(private var firstName:String,lastName:String) 解决方法 是的,有两个重要的区别。首先是容易的:没有var或val关键字的构造函数参
private var constructor参数和没有val / var的构造函数之间有什么区别?在范围/可见度方面是否相同?

例如:

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

解决方法

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

即使我们限制自己的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对象-private而不是class-private,它的工作原理就像一个纯旧的无关键字构造函数参数:

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

这甚至使用var而不是val:

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

这两个类都不会有字段。有关对象私有访问的更多详细信息,请参见第07节的第5.2节。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读