我有一个用例,我有这样的代码:
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 迭代处理。
我觉得这种方法是完美的。是否有任何设计缺陷?
当您无法在构造函数中进行初始化时,一种常见的模式是将构造函数设为私有并让静态方法返回新的、完全初始化的实例。
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...
}
这在您的类可以被继承时特别有用,因为如果子类由于初始化顺序而覆盖它们,则在构造函数中调用非私有方法可能会出现问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句