使用 Futures 和 Promises 进行延迟初始化是否合适,而不是使用 Option var 或一些可变变量?
您可以创建一个封装 promise 的工厂类:
class IntFactory{
val intPromise = Promise[Int]
def create () : Future[Int] = intPromise.future
def init (data : String) : Unit = intPromise success data.length
}
然后 Actor 或其他一些类可以像这样使用它:
class MyActor(factory : IntFactory) extends Actor{
val future_int = factory.create()
def receive = {
case (msg : String) => factory.init(msg) // Now the promise is fulfilled
}
}
这样做有什么不妥吗?以 Actor 为例可能不太理想,因为我认为 Actor 有更好的选择(成为或 FSM)。我目前正在考虑将其与非 Actor 类一起使用。在某些事件发生之前,一些实例变量什么都不是。我正在考虑这样做而不是使用 var 选项并将其设置为 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")
}
}
这样我就不必每次拿到另一件时都检查哪些是 None。
更多编辑:
我在原始问题中未能指定的一些附加信息:
初始化对象所需的数据将异步传入。
传递给 init 函数的数据是初始化所必需的。我编辑了我的示例代码,现在就是这种情况。
我没有使用 Akka。我认为 Akka 有助于快速组合示例,并且认为有经验的 Akka 人员可以提供有用的反馈。
最佳答案
是的,这肯定是比使用可变变量(无论是否使用 Option
)更好的方法。正如@PatrykĆwiek 所建议的那样,使用 lazy val
会更好,如果您可以随时初始化状态而不是等待外部事件并且不需要异步执行。
关于scala - 适合使用 Futures 和 Promises 进行延迟初始化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19760987/