2016-05-30 161 views
2

在java中,我瞭解到,我使用new關鍵字通過開發者頁面上下文對象,而不使用new關鍵字一樣被實例化要實例化一個對象如實例化對象

Employee e = new Employee(); 

在Android中,這個:

Context myContext = getApplicationContext(); 

這是爲什麼?我早該想到,一個上下文對象應創建使用new關鍵字像這樣以同樣的方式:

Context myContext = new Context(); 

我覺得有人可能會頂嘴說,getApplicationContext()方法返回類型的上下文,因此的對象上面的語法,但是否有人有一個更深更解釋,爲什麼做這個而不是簡單地 這樣

Context myContext = new Context(); 

回答

2

因爲有時候你根本不想/需要每次都創建一個新的實例,有時候你只想獲得對象而不需要自己實際處理它的創建。

例如,有一個Singleton design pattern,在其常見實現中,由於構造函數是私有的,因此無法使用new關鍵字創建新實例。那麼,什麼是剩下的工作就是通過調用一個靜態方法得到一個類的實例:

public class MySingleton { 
    private MySingleton() { } 

    public static MySingleton getInstance() { ... } 
} 

有時你可能需要使用一個Factory method pattern,來處理新對象的創建/實例化,以及:你調用一個方法並返回一個新的或現有的對象,而不顯式調用構造函數。

在Context的情況下,您不需要創建此對象,因爲系統會爲您處理它,並且該過程是透明的。你只需要調用一個方法,並且你有你的實例。

+0

這是非常有用的信息謝謝,我從來不知道Factory方法模式直到現在,getApplicationContext()是一個工廠方法的例子嗎? –

+1

工廠方法創建它們返回的對象,並且在調用getApplicationContext()時應用程序的上下文已經存在,因此不,這不完全是工廠方法。在這種情況下,我們更接近Singleton,因爲返回的對象是應用程序進程的單個全局對象。 –

2

從文檔:

返回 當前進程的單個全局應用程序對象的上下文。

因此,當您啓動應用程序時,系統會爲其分配一個進程。做Context c = new Context()不會讓你成爲那個過程的實例。

2

正如docs說:

接口有關的應用程序環境的全局信息。這是一個抽象類,其實現由Android系統提供。它允許訪問特定應用的資源和類,以及向上調用應用程序級的操作,如通過使用getApplicationContext()發射活動,廣播和接收意圖等

所以,您呼叫的情況下包含您的應用程序特定資源的對象。

創建一個新的Context類型對象沒有意義,因爲它不包含有關您的應用程序環境的信息。

+0

應用程序環境需要什麼? –

+1

我想這篇文章會更好地爲你解釋它http://www.simplecodestuffs.com/what-is-context-in-android/ –

+1

我曾閱讀上下文對象的最佳文章,謝謝 –