2016-09-14 121 views
0

例如被實例化,我有一個類當靜態變量Android中

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

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

而我的申請有2個活性A.java和B.java(從A I可以去B)。
在B活性我

import EagerInitializedSingleton.java; 

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

我的問題是,當instantiated被instantiated`

  • 當啓動應用程序(A活動開始之前)
  • 當進口EagerInitializedSingleton.java
  • 或者當EagerInitializedSingleton。 getInstance()

如果可能,我可以檢查什麼時候通過寫日誌或其他東西來實例化? 任何幫助將不勝感激。

UPDATE 我跟着在這裏創建EagerInitializedSingleton http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples
而且他們還有如果你的單例類沒有使用了大量的資源說

,這是使用 方法。但在大多數的場景中,辛格爾頓類 的資源,如文件系統,數據庫連接等 創建,我們應該避免的實例化,直到除非客戶端調用 getInstance方法

像一些回答說instance是當我打電話給EagerInitializedSingleton.getInstance()...時,實例化,那麼誰是正確的?

+0

供您參考http://stackoverflow.com/questions/8704423/when-static-variables-are-initialized-in-java –

+0

創建一個私人的,沒有參數'EagerInitializedSingleton'構造函數並調用你的'Log.d'有 – pskink

+0

@pskink請檢查我的更新,如果你不介意請給我一個解釋 –

回答

3

static當類加載器第一次加載類時(通過靜態引用或創建實例)變量被初始化。它將在班級的所有實例中共享。請記住,它將在任何類的實例創建之前初始化。

所以,在你的問題:

當啓動應用程序(活動開始之前)

沒有

當進口EagerInitializedSingleton.java

沒有

當EagerInitializedSingleton.getInstance()

或當你犯了一個靜態參考EagerInitializedSingleton類。

編輯 - 只是爲了澄清事情了按評論:

電話getInstance()不會結果實例創建。但該類的第一次加載時,類的static參考

+0

'只返回'instance' vararaiable,沒有其他的東西 – pskink

+0

'靜態字段在類加載器加載類時被初始化。默認值是在這個時候分配的。這是按照它們出現在源代碼中的順序完成的。「# – pskink

+0

@pskink,yes會返回實例,但會首先調用」new EagerInitializedSingleton()「。 –

1

當你調用EagerInitializedSingleton.getInstance()

1

對於初學者來說,這是不適當單實施。您的構造函數或缺少構造函數將允許用戶使用默認的空構造函數並創建該類的更多對象。看看如何實現它here或任何你在網上找到。

你問的問題與android無關,這是一個普通的Java問題,與static變量初始化有關。你可以找到這個問題的答案here

+0

謝謝。我訪問這個鏈接,但仍然困惑,請檢查我的更新。鏈接的所有者是否正確或@Rohit Arya的回答是正確的 –

+0

@pskink就像java鏈接,他們說'靜態變量只在執行開始時被初始化一次'。這裏的執行意味着當應用程序啓動 –

+0

鏈接的所有者通常**解釋**和Rohit回答你的問題。他已經回答了你的問題。我只是告訴你,你需要修復你的單例實現,然後你甚至不會有這個問題(因爲它不是一個正確的方式來初始化實例)。 – Vucko