gpt4 book ai didi

java - 创建 Activity 时未调用静态初始值设定项

转载 作者:行者123 更新时间:2023-11-29 03:00:31 26 4
gpt4 key购买 nike

我的主要 Activity 中有以下代码:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fabric.with(this, new Crashlytics());
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

MyClass[] arr = MyClass.values();
System.out.println(Arrays.deepToString(arr));

MyClass 如下:

public class MyClass {

public static MyClass A;
public static MyClass B;
public static MyClass C;

static {
System.out.println("Invoked");
A = new MyClass("a");
B = new MyClass("b");
C = new MyClass("c");
}

private static Map<String, MyClass> values = null;
private final String name;

private MyClass(String name) {
this.name = name;
if (values == null)
values = new HashMap<>();
values.put(name, this);
}

public static MyClass[] values() {
return values.values().toArray(new MyClass[values.size()]);
}
}

我的问题是 values() 触发了一个 NullPointerException,因为 values 是 null,即静态初始化 block 似乎没有被调用.尽管如此,控制台输出“Invoked”应用程序,因此确实调用了初始化 block 。

怎么了?

编辑:这个问题与此密切相关:Issue with static code in Android

最佳答案

是因为private static Map<String, MyClass> values = null;在静态初始化程序之后:此赋值将在静态初始化程序 block 之后运行,因此它被分配了一个非空值,然后被清零。

移动values初始化 block 之前的字段。


顺便说一句,我会将实例的创建与将它们插入 map 分离,以便在创建 MyClass 的实例时消除副作用.您也可以在没有静态初始化 block 的情况下执行此操作:

public class MyClass {
private static final Map<String, MyClass> values = new HashMap<>();

public static final MyClass A = register(new MyClass("a"));
public static final MyClass B = register(new MyClass("b"));
public static final MyClass C = register(new MyClass("c"));

private static MyClass register(MyClass instance) {
values.put(instance.name, instance);
return instance;
}

private MyClass(String name) {
this.name = name;
}
// ...
}

实际上,我什至不会这样做:我会使用 enum - 但我猜你的真实代码中有些东西阻止你这样做。

关于java - 创建 Activity 时未调用静态初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35297662/

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