我有一堆单身"工人"对象,以及一个中央存储库"这是一个精心伪装的地图,将工人姓名映射到工人:
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中执行我想要的任何其他方式(缺少使用反射或在存储库的定义中保留明确的工作列表)?
答案 0 :(得分:2)
我认为在存储库中注册自己不是Worker
构造函数的责任。如果你只有对象,我会这样做(对于读者来说也更清楚):
object Repository {
val workers: Map[String, Worker] = Map(
"a" -> WorkerA, // or whatever their names are
"x" -> WorkerX
)
}
如果你想动态地做,那么我会像你原来那样隐藏底层地图 - 因为它必须是可变的 - 并在创建后进行注册。此外,我还要注册创作者的责任。