从另一个静态变量构造函数调用静态变量

在我的 Android 应用程序中,我必须在第一个活动开始之前初始化很多静态对象。据我所知,静态变量在类加载时被初始化。所以,随着时间的推移,项目中静态对象的数量开始增长,现在我得到了 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;

    }


叮当猫咪
浏览 161回答 2
2回答

倚天杖

我试图用您提供的片段重建您的异常。我使用了以下代码: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();}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java