Scala定义类参数时是否应当使用val进行修饰?
Scala主构造参数加val的作用说明
首先澄清一个常见认知误区:普通Scala类的主构造参数不会默认隐式附带val属性,只有样例类(case class)的主构造参数才会默认被public val修饰,很多新手的误解都来自于样例类的特殊规则。
两种构造参数定义的本质区别
代码片段1:
class Train(number: Int)
这种不带修饰符的主构造参数,仅会被当作构造方法的入参处理:- 如果类内部没有任何方法使用该参数,编译后不会生成对应的类成员字段,构造执行完成后参数就会被销毁
- 如果类内部方法用到了该参数,编译器会自动生成一个
private[this]级别的私有字段,仅类内部可见,类的实例无法在外部访问train.number
代码片段2:
class Train(val number: Int)
显式加val修饰后,编译器会自动生成公开只读的类成员字段,以及对应的无参getter方法:- 类实例可以直接在外部调用
train.number获取参数值 - 因为是
val修饰,字段值初始化后不可修改,天然保证不可变性
- 类实例可以直接在外部调用
显式加val的核心好处
- 满足公开访问需求:如果你需要外部能读取类的构造参数,加
val是最简洁的实现方式,不需要手动编写额外的getter方法 - 强制不可变性:符合Scala推荐的不可变编程规范,避免属性被意外修改,减少业务Bug,多线程场景下也不需要额外处理同步逻辑
- 语义清晰可维护:明确标识该参数是类的公开属性,而非仅在构造阶段使用的临时入参,其他开发者读代码时能快速理解属性的作用范围
内容的提问来源于stack exchange,提问作者Jaime Montoya
相关产品推荐
相关产品推荐

