你如何处理对象的异步初始化?
How do you handle async initialization of an object?
假设我有一个对象 Foo
,它需要一些异步工作,bar()
,才能在它准备好使用之前完成。感觉就像我尝试的每个解决方案,我 运行 变成了反模式。
考虑的解决方案:
在Foo
中保留一个initialized
变量。在 Foo 的构造函数中调用 bar()
。 bar()
完成后,设置 initialized = true
。我对这种方法的问题是它在对象中引入了未初始化和初始化状态,在我看来应该避免这种情况。
在父级中设置 Foo
并通过参数注入数据。我对这种方法的问题是,它只是将问题推得更远;如果这样做了,现在其他 class 负责做 Foo
的初始工作。
在这种情况下,通常的做法是什么?谢谢!
returns Future 的静态工厂方法怎么样?
class Foo {
private static final ExecutorService executor =
Executors.newSingleThreadExecutor();
public static Future<Foo> construct() {
return executor.submit(() -> {
bar();
return new Foo();
});
}
private Foo() {}
}
假设我有一个对象 Foo
,它需要一些异步工作,bar()
,才能在它准备好使用之前完成。感觉就像我尝试的每个解决方案,我 运行 变成了反模式。
考虑的解决方案:
在
Foo
中保留一个initialized
变量。在 Foo 的构造函数中调用bar()
。bar()
完成后,设置initialized = true
。我对这种方法的问题是它在对象中引入了未初始化和初始化状态,在我看来应该避免这种情况。在父级中设置
Foo
并通过参数注入数据。我对这种方法的问题是,它只是将问题推得更远;如果这样做了,现在其他 class 负责做Foo
的初始工作。
在这种情况下,通常的做法是什么?谢谢!
returns Future 的静态工厂方法怎么样?
class Foo {
private static final ExecutorService executor =
Executors.newSingleThreadExecutor();
public static Future<Foo> construct() {
return executor.submit(() -> {
bar();
return new Foo();
});
}
private Foo() {}
}