我正在考慮爲上下文創建一個單例包裝,因此如果需要,我的模型對象可以打開並從數據庫連接讀取。我的模型對象無權訪問Context
,我想避免需要將對象的引用傳遞給Context
。上下文的單例包裝
我打算把這個單身人士放入Application.getApplicationContext()
返回的Context
。這個單例對象將在我的自定義Application
實例中被初始化,然後其他任何事情都需要或有機會使用它。
有沒有人能想到一個理由來不是這樣做?
我正在考慮爲上下文創建一個單例包裝,因此如果需要,我的模型對象可以打開並從數據庫連接讀取。我的模型對象無權訪問Context
,我想避免需要將對象的引用傳遞給Context
。上下文的單例包裝
我打算把這個單身人士放入Application.getApplicationContext()
返回的Context
。這個單例對象將在我的自定義Application
實例中被初始化,然後其他任何事情都需要或有機會使用它。
有沒有人能想到一個理由來不是這樣做?
我不知道我明白你的想法,但這裏是什麼工作了我:
public class MyApp extends Application {
private static MyApp instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
// ...
}
public static MyApp getInstance(){
return instance;
}
// misc helper methods
}
我會勸你去思考什麼原因,你有不傳遞應用程序的參考上下文到您的模型對象中。
使用單身人士存在各種記錄完善的缺點。我不會在這裏詳細討論,但您可能需要考慮:
如果你確實沒有把引用傳遞給應用程序的其他部分的原因,那麼也許你應該考慮一些其他模式 - 一個工廠可能是一個可能的解決方案,另一個服務。
感謝您的回覆!無論是好還是壞,我目前都沒有進行任何單元測試,所以我會忽略你的第一個警告。隱藏的依賴關係,是的,這可能是一個問題,但我認爲其他模式也是如此。至於生命週期,我只持有一個上下文而不是數據庫的引用,並且在應用程序的onDestroy()中我可以對包裝器執行任何清理。而對於你的第三個警告,我已經對這個包裝應用了適當的同步。至於服務,我認爲綁定對此有點矯枉過正,而自定義工廠無法返回應用程序的上下文。 – skyler 2010-05-03 20:44:31
這並不是說你的警告是無效的,而是我認爲我可以安全地解釋它們。不幸的是,字符限制可能會使回覆看起來簡潔而不友善! – skyler 2010-05-03 20:53:37
沒問題!你已經清楚地考慮了手邊的問題,並且很高興在這種情況下使用單身人士的限制是你很樂意付出的代價(嘿,一切都有代價,對吧?)我並不完全反對單身人士無論如何,但我已經親眼目睹了他們不適當使用它們的損害(在多個場合中)。 – 2010-05-03 21:01:56
粘貼在這裏以保留格式。
public class ContextContainer
{
private static boolean initialized;
private static Context context;
private ContextContainer()
{
//
}
public static synchronized void setApplicationContext(Context context)
{
if (!initialized) {
ContextContainer.context = context;
initialized = true;
} else {
throw new RuntimeException("ApplicationContext has already been set!");
}
}
public static synchronized Context getApplicationContext()
{
return context;
}
}
我應該注意到我的原始實現是一個合適的單例,但是我選擇使用靜態成員和訪問器。 – skyler 2010-05-03 20:58:20
我在一個答案中粘貼了我的實現,我可以保留格式和換行符。我的班與你的做法大致相同。 – skyler 2010-05-03 20:52:24