初始化静态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:
的怪异的行为,我看到更有意义,我的解释是,静态变量实例绑定到第一次初始化它们的类的类加载器。
我能想到的唯一的区别是,当你做
private static final CustomObject instance = new CustomObject();
,当你启动应用程序时,将创建并为它分配空间。 请注意,它可能永远不会被使用,但它仍然会使用内存。
当你在onCreate方法上创建它时,它只会在被调用时创建一个实例。
使用静态还有一个缺点,就是它会使用你的perm gen空间,如果碰巧它没有给它空间或者无法创建它,你的程序会在启动时崩溃。让你感到困惑。
我强烈建议使用onCreate方法。
哎呀。我的错。忘记用SimpleSingleton替换CustomObject。编辑代码。我接受你的答案,因为我会用OnCreate方法(现在),尤其是因为你提出了另一个我没有想过的初始化单例的问题。 – 2014-09-13 08:20:27
我认为文章中有很多混淆,静态变量实例确实绑定到类初始化它们的类加载器,也就是说,或者应该是单例类本身。 其实我更倾向于认为作者在他的代码中存在某种类型的错误,这使得单例实例会随着时间的推移而变化,并且诊断出将另一个地方的变量实例化为“有效”作为解决方法。 我总是在android中使用单例,不需要在类本身以外的其他地方初始化它们,我从来没有任何这样的问题。 – Lake 2014-09-13 07:42:31