Eager 初始化 vs Lazy 初始化用例

bit_cracker007

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

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 迭代处理。

我觉得这种方法是完美的。是否有任何设计缺陷?

杰里米

当您无法在构造函数中进行初始化时,一种常见的模式是将构造函数设为私有并让静态方法返回新的、完全初始化的实例。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

初始化char * vs int *

来自分类Dev

Swift vs ObjC初始化过程?

来自分类Dev

{} vs.()类成员的初始化

来自分类Dev

int * vs char *初始化

来自分类Dev

defaultdict vs dict元素初始化

来自分类Dev

VS初始化灵活数组C ++

来自分类Dev

@Lazy可以初始化Spring @Value吗?

来自分类Dev

Spring 的 @Lazy 初始化线程安全吗?

来自分类Dev

初始化块vs构造函数vs变量初始化

来自分类Dev

静态初始化程序vs实例初始化程序vs构造函数

来自分类Dev

值初始化vs Calloc vs手动初始化速度

来自分类Dev

初始化块vs构造函数vs变量初始化

来自分类Dev

为什么在Eager初始化中,在加载类时创建的单例类的实例可能会带来缺点?

来自分类Dev

为什么在Eager初始化中,在加载类时创建的单例类的实例可能会带来缺点?

来自分类Dev

在VS 2013中使用初始化列表初始化地图

来自分类Dev

VS2013默认初始化与值初始化

来自分类Dev

VS2013默认初始化与值初始化

来自分类Dev

用clang vs gcc进行联合零初始化

来自分类Dev

VS2013列表初始化

来自分类Dev

班级成员初始化程序在VS 2013中失败

来自分类Dev

Python Generator vs列表作为数组初始化器

来自分类Dev

复制vs移动std :: pair支持初始化

来自分类Dev

C ++:显式vs隐式默认初始化

来自分类Dev

用clang vs gcc进行联合零初始化

来自分类Dev

用名称vs变量初始化对象

来自分类Dev

SFINAE 关于 VS10 中的阵列初始化

来自分类Dev

未初始化的最终局部变量VS未初始化的最后实例变量

来自分类Dev

单例+初始化代码

来自分类Dev

单例模式的延迟初始化