使用 Futures 和 Promises 进行延迟初始化是否合适,而不是使用 Option var 或一些可变变量?
您可以创建一个封装承诺的工厂类:
class IntFactory{
val intPromise = Promise[Int]
def create () : Future[Int] = intPromise.future
def init (data : String) : Unit = intPromise success data.length
}
然后演员或其他一些类可以像这样使用它:
class MyActor(factory : IntFactory) extends Actor{
val future_int = factory.create()
def receive = {
case (msg : String) => factory.init(msg) // Now the promise is fulfilled
}
}
做这样的事情有什么问题吗?以演员为例可能并不理想,因为我认为演员有更好的选择(成为或 FSM)。我目前正在考虑将它与非演员类一起使用。在某些事件发生之前,一些实例变量什么都不是。我正在考虑这样做,而不是使用 var Option 并将其设置为 None。如果这很糟糕,还有哪些其他选择?
编辑:
我想到了这可能更有用的情况。如果我有多个需要初始化的东西,并且我有一些我想在完成后执行的异步操作:
class MyActor(factory1 : IntFactory, factory2 : IntFactory) extends Actor{
val future_int1 = factory1.create()
val future_int2 = factory2.create()
for{
x <- future_int1
y <- future_int2
} // Do some stuff when both are complete
def receive = {
case "first" => factory1.init("first")
case "second" => factory2.init("second")
}
}
这样我就不必在每次得到另一块时检查哪些是无的。
更多编辑:
我在原始问题中未能指定的一些附加信息:
初始化对象所需的数据将异步传入。
初始化需要传递给 init 函数的数据。我编辑了我的示例代码,现在就是这种情况。
我没有使用 Akka。我认为 Akka 有助于整理一个快速示例,并认为有经验的 Akka 人员可以提供有用的反馈。