开篇:
正如《Effective Java》第二版中第71条目“慎用延迟初始化”所说:
大多数的域应该正常的被初始化而不是延迟初始化。如果为了达到性能目标,或者为了破坏有害的初始化循环,而必须延迟初始化一个域,就可以使用相应的延迟初始化方法。
对于实例域,就使用双重检查模式(double-check idiom);对于静态域,则使用 lazy initialization hodler class idiom。
对于可以接受重复初始化的实例域,也可以考虑使用单检查模式(single-check idiom)。
PS:double-check idiom 也有称 double-check lock(DCL)。
实践延迟初始化:
可见,对不同的域(实例域 和 静态域)有不同的延迟初始化模式。
实例域延迟初始化代码,注意实例域是 volatile 声明的:
1 private volatile Object field; 2 3 private Object getField() { 4 Object result = field; 5 if (result == null) { 6 synchronized (this) { 7 result = field; 8 if (result == null) { 9 field = result = computeFieldValue(); 10 } 11 } 12 } 13 return result; 14 }
静态域延迟初始化代码:
1 private static class FieldHolder { 2 static final Object staticField = computeStaticFieldValue(); 3 } 4 5 public static Object getStaticField() { 6 return FieldHolder.staticField; 7 }