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
相关产品推荐
相关产品推荐

