繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM