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

如何定义仅能通过其伴生对象创建的Scala enum(智能构造器实现)

问题原因

你为枚举case的构造器添加private修饰时,Scala为该case自动生成的伴生对象apply方法也会被标记为私有,且默认私有作用域仅限定在case类内部,外部的枚举伴生对象X没有访问权限,因此触发了apply方法不可访问的报错。

解决方案
  • 方案1:限定私有作用域到枚举伴生对象
    如果只需要限制单个枚举case的实例化入口,将private修改为private[X],放宽访问权限到X伴生对象即可:
enum X {
  case Stuff private[X] (value: Int)
}

object X {
  def stuff(s: String) = 
    X.Stuff(performSomeValidationAndCalculation(s))
  
  // 替换为你的实际校验计算逻辑
  private def performSomeValidationAndCalculation(s: String): Int = s.length
}

修改后外部代码无法直接调用X.Stuff(xxx)实例化,只能通过你封装了校验逻辑的X.stuff(s)方法创建实例,完全满足避免无效实例、限制实例化入口的需求。

  • 方案2:枚举主构造器统一私有
    如果你所有枚举case都需要限制实例化入口,可以直接将私有修饰加在枚举的主构造器上,所有case会继承该访问限制:
enum X private (value: Int) {
  case Stuff(value: Int)
}

object X {
  def stuff(s: String) = 
    X.Stuff(performSomeValidationAndCalculation(s))
}

该方案会统一限制该枚举下所有case的直接实例化权限,无需逐个为case添加私有修饰。

内容的提问来源于stack exchange,提问作者Alvaro Carrasco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:54:10