Java中的静态变量的惰性初始化 - 执行?

时间:2013-12-02 19:12:42

标签: java static initialization lazy-loading field

我就是这样做的(android代码)

private volatile static WifiManager wm;

private static WifiManager wm(Context ctx) {
    WifiManager result = wm;
    if (result == null) {
        synchronized (WifiMonitor.class) { // the enclosing class
            result = wm;
            if (result == null) {
                result = wm = (WifiManager) ctx
                    .getSystemService(Context.WIFI_SERVICE);
                if (result == null) throw new WmNotAvailableException();
            }
        }
    }
    return result;
}

Effective Java中的Bloch建议:

// Lazy initialization holder class idiom for static fields
private static class FieldHolder {

    static final FieldType field = computeFieldValue();
}

static FieldType getField() {
    return FieldHolder.field;
}

这具有省去同步的优点,并且JVM优化了现场访问。问题是我需要一个Context对象。所以:

  • 有没有办法让Bloch的模式适应我的情况(computeFieldValue()需要一个参数)?
  • 如果没有,有没有办法execute around?代码很微妙,我宁愿把它放在一个地方,只传递
  • 中所需的行为
  • 最后但并非最不重要 - 是否有办法仅通过wm方法强制访问缓存字段(wm())?所以我可以避免NPE等。其他语言使用此
  • 的属性

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作

static int param1;
static String param2;

public static void params(int param1, String param2) {
     this.param1 = param1;
     this.param2 = param2;
}

private static class FieldHolder {

    static final FieldType field = new FieldType(param1, param2);
}

static FieldType getField() {
    return FieldHolder.field;
}

注意:比这更简单的是使用枚举,

enum Singleton {
    INSTANCE;
}

class SingletonParams {
    static X param1;
}

enum Singleton implements MyInterface {
     INSTANCE(SingletonParams.param1, ...);
}