如何从double check idiom创建单例来实现实例字段的延迟初始化?

时间:2013-04-28 17:41:19

标签: java singleton effective-java

private volatile FieldType field;
FieldType getField() {
    FieldType result = field;
    if (result == null) { 
        synchronized(this) {
            result = field;
            if (result == null) 
                field = result = computeFieldValue();
        }
    }
    return result;
}

我们几乎都知道这是double check idiom for lazy initialization of instance field的示例代码。但我在这里有一个愚蠢的怀疑,有人会如何创建FieldType的单例对象。至于调用函数getField()(创建单例实例),你需要一个类的实例,但到目前为止你还没有实例。我有点困惑,请让我知道。感谢!!!

2 个答案:

答案 0 :(得分:1)

源代码中最简单的单例是枚举

enum Singleton {
    INSTANCE;
}

但在这个更复杂的案例中,

  

有人将如何创建FieldType的单例对象。

他们必须致电getField()static必须field,{{1}}

答案 1 :(得分:0)

作为单身第一个

FieldType getField()

应定义为

public static FieldType getField()

这样可以调用getField()的方法FiledType(静态方法),而无需创建实例

当然,您需要为FieldType定义私有 构造函数(此处缺少)