java - 具有单例和工厂模式的空指针
问题描述
我有一个我一生都无法理解的问题。为什么我在这里得到一个空指针?
原则上我有三个班级。一个单例类,一个工厂类和一个主类。在 Main 我调用 Singleton 类一次,让我输出一些东西。
然后我在工厂调用一个静态方法。在这个工厂类中有一个静态块,它依次访问单例类。然而,此时单例类的实例为空。
我不太明白这一点,因为使用调试器我还看到变量为空,但调用的流程实际上与预期的一样。
主.java
package testing;
public class Main {
public static void main(String[] args) {
Singleton.getInstance().getValue();
Factory.build();
}
}
单例.java
package testing;
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private String value;
public static Singleton getInstance() {
return INSTANCE;
}
private Singleton() {
configureSingleton();
Factory.build();
}
private void configureSingleton() {
value = "TEST";
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
工厂.java
package testing;
public class Factory {
static {
Singleton instance = Singleton.getInstance();
System.out.println(instance.getValue());
}
private Factory() {
}
public static void build() {
System.out.println("Building now");
}
}
解决方案
问题是您在构造函数Factory.build();
内部调用。Singleton
执行顺序可能有问题。
特别是:Factory.build();
在分配INSTANCE
发生之前调用。
推荐阅读
- keras - plot_model 无法正常工作,因为带有 args 的“点”
- c# - 基于决策的游戏与 2 个按钮统一?
- python - 回归线图
- python - 如何重定向到分配给python中索引号的特定url
- sql - 在 Oracle 中查询以使用子查询进行选择
- android - 当我将移动网络从 wifi 更改为 4G 时,如何在 Android 和 iOS 上继续 WebRTC 流
- uwp - 没有涓流冰的 Webrtc 和 UWP
- c++ - 如果它是基于之前的 if 条件在 C++ 中创建的,我如何在代码中使用后者的实例
- c# - 无法在 Mono 上编译 MojoPortal:/usr/lib/mono/msbuild/15.0/bin/Microsoft.Common.CurrentVersion.targets(5,5):错误 MSB3073
- android - 在android中安装权限