在Android中实例化静态变量时

时间:2016-09-14 08:20:29

标签: java android

例如,我有一个班级

public class EagerInitializedSingleton {
        private static final EagerInitializedSingleton instance = new EagerInitializedSingleton();

        public static EagerInitializedSingleton getInstance(){
            return instance;
        }
}

我的应用程序有两个活动A.java和B.java(来自A我可以去B) 在B活动中,我有

import EagerInitializedSingleton.java;

public class B{
     onCreate(...){
         EagerInitializedSingleton.getInstance()...
     }
}

我的问题是instantiated何时被实例化

  • 启动应用程序(活动开始前)
  • 导入EagerInitializedSingleton.java
  • 或者当EagerInitializedSingleton.getInstance()

如果可能,我可以检查何时通过写入日志或其他东西进行实例化? 任何帮助都将非常感激。

更新 我按照此处创建EagerInitializedSingleton http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples
他们说了

  

如果您的单例类没有使用大量资源,那就是   使用方法。但在大多数场景中,Singleton类都是   为文件系统,数据库连接等资源创建   我们应该避免实例化,除非客户端调用   getInstance方法

像某些回答一样,当我致电instance时,EagerInitializedSingleton.getInstance()...会被实例化,那么谁是正确的?

3 个答案:

答案 0 :(得分:3)

当类加载器第一次加载类时,通过静态引用或实例创建初始化

static个变量。它将在课程的所有实例中共享。请记住,它将在任何实例创建之前初始化。

所以,在你的问题中:

  

启动应用程序时(活动开始前)

没有

  

导入EagerInitializedSingleton.java

没有

  

当EagerInitializedSingleton.getInstance()

或者每当您对EagerInitializedSingleton类进行静态引用时。

修改 - 只是根据评论清除内容:

致电getInstance() 不会导致实例创建。但是,类的 static引用会在第一次加载类时执行。

答案 1 :(得分:1)

致电EagerInitializedSingleton.getInstance()

答案 2 :(得分:1)

对于初学者来说,这是不是一个合适的单例实现。您的构造函数或缺少构造函数将允许用户使用默认的空构造函数并创建该类的更多对象。查看如何实施here或在线找到的任何地方。

你问的问题与android无关,这是一个简单的Java问题,与static变量初始化有关。您可以找到该问题的答案here