[英]Calling static variable from another static variable constructor
在我的Android应用程序中,我必须在第一个Activity开始之前初始化很多静态对象。 据我所知,静态变量是在类加载时初始化的。 因此,随着时间的流逝,项目中静态对象的数量开始增长,现在我得到了NullPointerExceptions。 就我而言,静态对象可以在其构造函数中调用其他静态对象。 所以我的问题是:是否可以在某些静态变量依赖于变量之前初始化它们,从而导致NullPointersExceptions? 那可能吗? 代码示例:
private static class HardwareManagersHolder implements HardwareManagers, IManagers {
private final AtomicBoolean senderAcquire = new AtomicBoolean(false);
private final AtomicInteger receiverAcquire = new AtomicInteger(0);
public IAudioManager audioManager;
public IVideoManager videoManager;
public IVibrationManager vibrationManager;
public IBatteryHelper batteryHelper;
@Override
public void configureManager() {
audioManager = AudioHelper.getInstance();
vibrationManager = VibrationManager.getInstance();
videoManager = VideoManager.getInstance();
batteryHelper = BatteryHelper.getInstance();
}
还有一个对象持有人:
public class VideoManager implements IVideoManager {
private static class VideoManagerHolder {
public static final VideoManager VIDEO_MANAGER_INSTANCE = new VideoManager();
}
public static VideoManager getInstance() {
return VideoManagerHolder.VIDEO_MANAGER_INSTANCE;
}
}
我试图用您提供的代码片段来重构您的异常。 我使用以下代码:
public interface IVideoManager {}
public class VideoManager implements IVideoManager {
private static class HardwareManagersHolder {
public IVideoManager videoManager;
public void configureManager() {
videoManager = VideoManager.getInstance();
}
}
private static class VideoManagerHolder {
public static final VideoManager VIDEO_MANAGER_INSTANCE = new VideoManager();
}
public static VideoManager getInstance() {
return VideoManagerHolder.VIDEO_MANAGER_INSTANCE;
}
public static void main(String[] arg) {
System.out.println("Start test");
HardwareManagersHolder h = new HardwareManagersHolder();
h.configureManager();
if (h.videoManager == null) {
System.out.println("VideoManager is null");
}
System.out.println("Test finished");
}
}
该代码在我的机器上有效。 如果此代码不适用于您的代码,则还有其他错误。
您要在静态构造函数中对其进行初始化吗? 正是由于这个原因,他们会首先被召唤。
static
{
VIDEO_MANAGER_INSTANCE = new VideoManager();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.