scala动态确定类型

xie*_*fei 7 scala

我想创建其类型由运行时数据确定的对象实例:

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中做多方法 "?我相信设计模式只是因为语言无能力而存在,这就是为什么我不愿意接受基于工厂的答案.

Rya*_*yan 3

这并不能解决你的问题,但如果你做了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)