java - 热切初始化与延迟初始化用例

标签 java constructor initialization global-variables

我有一个用例,其中有这样的代码:

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的初始化取决于AB的处理内容> 流程。因此,我以迭代方式进行初始化。(延迟初始化)。

但有人告诉我应该严格设计,以便每个构造函数(ABC)初始化都应该在仅限 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/

相关文章:

java - 正则表达式在java中验证用户名

C#:结构构造函数性能

asp.net-mvc - 在每个请求上调用 Controller 构造函数

java - 复制构造函数和多态性

java - 为什么我们可以通过字面量来初始化String、Integer?

java - 如果模型大小大于零,zk 列表框可见

java - Android:下载大量文件并将其保存在SD卡上

java - Applet 不会初始化,但需要是抽象的

java - android中的弱引用/异步任务模式

c++ - 分配给已删除/未初始化的对象