2015-07-03 73 views
0

我已經開始使用Android Big Nerd Ranch指南學習android。 清單9.1建立單(CrimeLab.java)Singleton和Context

public class CrimeLab { 
    private static CrimeLab sCrimeLab; 
    private Context mAppContext; 

    private CrimeLab(Context appContext) { 
     mAppContext = appContext; 
    } 

    public static CrimeLab get(Context c) { 
     if (sCrimeLab == null) { 
      sCrimeLab = new CrimeLab(c.getApplicationContext()); 
     } 
     return sCrimeLab; 
    } 
} 

項目 - 我們正在創造犯罪對象的名單,我們使用這個類來存儲列表。

我很難理解代碼9.1中提供的Singleton類的需求。爲什麼我們首先需要這門課?爲什麼需要一個上下文變量,它有什麼作用?

我搜索谷歌,發現上下文用於通知應用程序的其他部分正在發生什麼。但是,我沒有完全知道我們通知CrimeLab的是什麼?我們可以創建沒有單身課程的犯罪實驗室嗎?如果是,爲什麼我們將crimeLab用作單身課程?

回答

0

這不是Android的問題,它只是一個設計模式本身。 我已閱讀Android Big Nerd Ranch指南中的此示例。代碼9.1設置單身人士(CrimeLab.java)和單身人士的理由是我們想要存儲共享的數據。讓我們想象一下,當我們構造不單身的CrimeLab對象在兩個地方:

CrimeLab cb1 = new CrimeLab(context); 
CrimeLab cb2 = new CrimeLab(context); 

它創建新的對象,並在CB1和CB2存儲的數據是不同的。

想象一下你在應用程序中使用數據庫,應該是只有一個?是。

但目標相同的目的(單數據的地方),我們可以使用靜態方法或屬性,但是你需要通過隱藏構造

private CrimeLab(Context appContext) { 
    mAppContext = appContext; 
} 
+0

哦防止創建對象!我們需要上下文來告訴應用程序發生了什麼,以便所有數據都能很好地集中在一個地方。我對嗎?非常感謝你 –

+0

不,我們只需要在這裏的上下文,如果我們*需要*其信息CrimeLab對象。否則,您可以刪除它,因爲它本身就是一個參數。數據在一個地方是因爲單例實現(一個靜態屬性): private static CrimeLab sCrimeLab; –

0

單身人士是一類人,其中最多隻能有一人。因此,私人構造函數和公共靜態獲得。

公共靜態get通常是無參數的。原因是,如果使用不同的參數調用它,那麼調用順序將導致單例初始化的方式不同,因此您很容易出現競爭條件。

沒有更多的上下文我只能斷定這樣的代碼是不好的。