我想创建其类型由运行时数据确定的对象实例:
trait Business
case class Business1() extends Business
case class Business2() extends Business
object Business {
def fromData(data:Array[Byte]): Business = data(0) match {
case 1 => new Business1
case 2 => new Business2
case _ => throw new RuntimeException("data error")
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以完成它的工作,但是它有一个关闭它的问题.每当我实现一个新的Business子类时,我都必须修改Business.fromData代码,例如
case 3 => new Business3
Run Code Online (Sandbox Code Playgroud)
如何定义Business.fromData一次,以后可以添加Business3,Business4而无需注册?
编辑
我终于意识到这是一个完美的用例Multimethod,即基于某个参数的函数进行调度.所以更一般的问题应该是" 如何在scala中做多方法 "?我相信设计模式只是因为语言无能力而存在,这就是为什么我不愿意接受基于工厂的答案.
这并不能解决你的问题,但如果你做了Business一个“密封”特征,那么编译器将捕获任何非详尽的匹配,直到你更新fromData:
sealed trait Business
case class Business1() extends Business
case class Business2() extends Business
biz match {
case Business1 => println("Business1")
}
Run Code Online (Sandbox Code Playgroud)
...将导致...
warning: match is not exhaustive!
missing combination Business2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |