为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

叮当猫咪 2021-12-10 16:21:27
在我的 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;    }
查看完整描述

2 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

我试图用您提供的片段重建您的异常。我使用了以下代码:


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");

  }


}

此代码适用于我的机器。如果此代码不适用于您的代码,则说明存在其他错误。


查看完整回答
反对 回复 2021-12-10
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

您是否在静态构造函数中初始化它们?正是因为这个原因,他们会首先被召唤。


static 

    VIDEO_MANAGER_INSTANCE = new VideoManager();

}


查看完整回答
反对 回复 2021-12-10
  • 2 回答
  • 0 关注
  • 160 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信