在Application.OnCreate()期间初始化声明中的静态最终变量与初始化

时间:2014-09-13 07:22:18

标签: java android

我想在活动之间存储一个对象状态(已经被认为是Parcelables,JSON,yadda yadda),但由于我有几个Singletons,所以也可以在扩展Application的类中引用它们(模块化+易于维护)

所以对于我的问题,让我说我有一个简单的单身人士:

class SimpleSingleton
{
    private static final SimpleSingleton instance;   //The question will refer this line later.
    public static SimpleSingleton getInstance()
    {
        return instance;
    }

    private SimpleSingleton(){}
}

1:首先,我在上面的类中创建一个initInstance()方法,例如:

class SimpleSingleton
{
    //... the code above

    public static void initInstance()
    {
        if(instance == null) instance = new SimpleSingleton();
    }
}

2:因此下面的作品,(之后,我可以通过CustomSingleton.getInstance()引用任何活动中的单身人士):

class MyApp extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
        initSingletons();
    }

    protected void initSingletons()
    {
        SimpleSingleton.initInstance();
    }
}

BUT。如果我宣布

怎么办?

private static final SimpleSingleton instance = new SimpleSingleton();

而不是

private static final SimpleSingleton instance;

在SimpleSingleton类中

我假设对象在编译期间被初始化,那么这不会使整个#1和#2变得不必要吗?或者我的订单是否错误(特别是在课程实际初始化时)?我来自C#,目前正在为Android开发,所以当我想引用我的单身人士时,这有点给了我一个快速的问题。另外,我问这个since according to this blog

  

我看到的对我更有意义的奇怪行为的解释是静态变量实例绑定到首先初始化它们的类的类加载器。

1 个答案:

答案 0 :(得分:1)

我能想到的唯一区别就是你做什么

private static final CustomObject instance = new CustomObject();

启动应用程序时,它将为其创建并分配空间。 请注意,它可能永远不会被使用,但它仍然会使用内存。

当你在onCreate方法上创建它时,它只会在调用它时创建一个实例。

使用静态还有另外一个缺点,即它将使用你的perm gen空间,如果它偶然无法给它空间或无法创建它,你的程序将在启动时崩溃。让你困惑。

我强烈建议使用onCreate方法。