gpt4 book ai didi

java - Java 中静态变量的延迟初始化 - 执行?

转载 作者:行者123 更新时间:2023-11-29 08:55:47 24 4
gpt4 key购买 nike

我就是这样做的(安卓代码)

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 等。其他语言为此使用属性

最佳答案

您可以执行以下操作

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, ...);
}

关于java - Java 中静态变量的延迟初始化 - 执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20335989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com