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

Scala 3枚举参数默认为private val而非public val是否属于预期行为?是否存在编译器Bug?

Scala 3枚举参数默认私有是预期行为吗?

这完全是Scala 3枚举的预期行为,并不是编译器Bug!

背后的规则解释

Scala 3里枚举类的构造参数遵循和普通类一致的访问权限规则:

  • 当你在枚举类定义中只写参数名和类型(比如enum Planet(radius: Double)),这个参数默认是私有val,它的作用域仅限当前枚举实例内部。这就是为什么你能在getRadius()方法里用this.radius(访问自身实例的私有成员),但尝试跨实例访问planet.radius时会报错——私有成员不允许被其他实例访问。
  • 如果希望参数成为枚举类的公开成员,必须显式在参数前加上val(或var,不过枚举参数通常用不可变的val),比如enum Color(val rgb: Int),此时rgb会被生成为枚举类的公开成员变量,所有实例都能互相访问这个属性。

对应代码示例验证

默认私有参数的情况(报错场景)

enum Planet(radius: Double):
  case Mercury extends Planet(2.4397e6)
  def getRadius() = this.radius // 自身实例访问私有成员,正常
  def getRadius(planet:Planet) = planet.radius // 报错:value radius cannot be accessed as a member of planet:Planet

显式声明公开val的情况(正常场景)

enum Color(val rgb: Int):
  case Red extends Color(0xFF0000)
  def getRGB(color:Color):Int = color.rgb // 正常访问公开成员

设计初衷

这种默认私有设计是为了遵循面向对象的封装原则——默认隐藏内部状态,只在需要时显式暴露成员,避免意外泄露不必要的参数细节,让枚举的API设计更严谨。

内容的提问来源于stack exchange,提问作者John Morris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:47:37