初始化静态final变量声明与初始化在Application.OnCreate()

问题描述:

我想存储活动之间的对象状态(已考虑Parcelables,JSON,yadda yadda),但由于我有几个单身人士,不妨参考他们在扩展应用程序的类中(模块化+易于维护)。初始化静态final变量声明与初始化在Application.OnCreate()

所以我的问题,比方说,我有一个简单单:

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(); 
    } 
} 

但是。如果我在SimpleSingleton类中声明的

private static final SimpleSingleton instance = new SimpleSingleton();

代替

private static final SimpleSingleton instance;

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

的怪异的行为,我看到更有意义,我的解释是,静态变量实例绑定到第一次初始化它们的类的类加载器。

+0

我认为文章中有很多混淆,静态变量实例确实绑定到类初始化它们的类加载器,也就是说,或者应该是单例类本身。 其实我更倾向于认为作者在他的代码中存在某种类型的错误,这使得单例实例会随着时间的推移而变化,并且诊断出将另一个地方的变量实例化为“有效”作为解决方法。 我总是在android中使用单例,不需要在类本身以外的其他地方初始化它们,我从来没有任何这样的问题。 – Lake 2014-09-13 07:42:31

我能想到的唯一的区别是,当你做

private static final CustomObject instance = new CustomObject(); 

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

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

使用静态还有一个缺点,就是它会使用你的perm gen空间,如果碰巧它没有给它空间或者无法创建它,你的程序会在启动时崩溃。让你感到困惑。

我强烈建议使用onCreate方法。

+0

哎呀。我的错。忘记用SimpleSingleton替换CustomObject。编辑代码。我接受你的答案,因为我会用OnCreate方法(现在),尤其是因为你提出了另一个我没有想过的初始化单例的问题。 – 2014-09-13 08:20:27