Scala:获取随播对象以在存储库对象中注册自己

时间:2016-06-01 14:08:29

标签: scala

我有一堆单身"工人"对象,以及一个中央存储库"这是一个精心伪装的地图,将工人姓名映射到工人:

trait Worker { def work(): String }
object WorkerA extends Worker { [...] }
[...]
object WorkerX extends Worker  { [...] }
object Repository {
  private val repo: scala.collection.mutable.Map[String,Worker] = Map()
  def register(name:String,worker:Worker) = repo.put(name,worker)
}

我真的希望在程序开始时自动填充所有工作人员的存储库,所以我尝试过这样的事情:

object WorkerA extends Worker {
  ... 
  println("Registering A")
  Repository.register("A",this)
}

但令我惊讶的是#34;注册A"从未打印过(并且工作人员未在存储库中注册)。我发现这是因为Scala对初始化伴随对象很懒惰。

那么,有没有办法强制非延迟初始化,或者我可以在Scala中执行我想要的任何其他方式(缺少使用反射或在存储库的定义中保留明确的工作列表)?

1 个答案:

答案 0 :(得分:2)

我认为在存储库中注册自己不是Worker构造函数的责任。如果你只有对象,我会这样做(对于读者来说也更清楚):

object Repository {
  val workers: Map[String, Worker] = Map(
    "a" -> WorkerA, // or whatever their names are
    "x" -> WorkerX
  )
}

如果你想动态地做,那么我会像你原来那样隐藏底层地图 - 因为它必须是可变的 - 并在创建后进行注册。此外,我还要注册创作者的责任。