You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的核心好处

  1. 满足公开访问需求:如果你需要外部能读取类的构造参数,加val是最简洁的实现方式,不需要手动编写额外的getter方法
  2. 强制不可变性:符合Scala推荐的不可变编程规范,避免属性被意外修改,减少业务Bug,多线程场景下也不需要额外处理同步逻辑
  3. 语义清晰可维护:明确标识该参数是类的公开属性,而非仅在构造阶段使用的临时入参,其他开发者读代码时能快速理解属性的作用范围

内容的提问来源于stack exchange,提问作者Jaime Montoya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:24:03