如何定义仅能通过其伴生对象创建的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
相关产品推荐
相关产品推荐

