2014-09-13 174 views
-1

我想存儲活動之間的對象狀態(已考慮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

回答

0

我能想到的唯一的區別是,當你做

private static final CustomObject instance = new CustomObject(); 

,當你啓動應用程序時,將創建併爲它分配空間。 請注意,它可能永遠不會被使用,但它仍然會使用內存。

當你在onCreate方法上創建它時,它只會在被調用時創建一個實例。

使用靜態還有一個缺點,就是它會使用你的perm gen空間,如果碰巧它沒有給它空間或者無法創建它,你的程序會在啓動時崩潰。讓你感到困惑。

我強烈建議使用onCreate方法。

+0

哎呀。我的錯。忘記用SimpleSingleton替換CustomObject。編輯代碼。我接受你的答案,因爲我會用OnCreate方法(現在),尤其是因爲你提出了另一個我沒有想過的初始化單例的問題。 – 2014-09-13 08:20:27