我有一个用例,其中有这样的代码:
public class Xapp extends App {
private A a;
private B b;
private C c;
public Xapp() {
// do anything
}
@override
public void doStuff() {
try{
do1();
do2();
do3()
} catch(Exception e) {
throw new XappException(msg);
}
}
public void do1() {
a = new A();
a.process();
}
public void do2() {
b = new B();
b.process();
}
public void do3() {
c = new C();
c.process();
}
}
将从 main 中的 TopApp 类调用:(严格要求)
new Xapp.doStuff()
这里,B的初始化取决于A处理的内容,C的初始化取决于A和B的处理内容> 流程。因此,我以迭代方式进行初始化。(延迟初始化)。
但有人告诉我应该严格设计,以便每个构造函数(A、B 和 C)初始化都应该在仅限 Xapp 构造函数。 (急切初始化)
我不同意。因为我的代码流程是以生产者和消费者的方式迭代的。通常,当资源可用时,我们会进行急切初始化。但在这里我不能,因为资源将由 A、B、C 迭代处理。
我发现这种方法非常完美。是否存在设计缺陷?
最佳答案
当您无法在构造函数中进行初始化时,常见的模式是将构造函数设置为私有(private),并让静态方法返回新的、完全初始化的实例。
public class Xapp extends App {
private A a;
private B b;
private C c;
private Xapp() {
// do anything
}
public static Xapp newInstance() {
Xapp x = new Xapp();
x.doStuff();
return x
}
// snip...
}
当您的类可以被继承时,这尤其有用,因为如果子类由于初始化顺序而覆盖了非私有(private)方法,那么在构造函数中调用非私有(private)方法可能会出现问题。
关于java - 热切初始化与延迟初始化用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42592649/