EP39-全局靜態(tài)ApplicationContext的問題

上一篇提到可以用一個(gè)全局靜態(tài)context來替代context單例。那在App的一個(gè)公共基礎(chǔ)類里面(比如我們的RunningContext)定義一個(gè)全局靜態(tài)context會有問題嗎?

    public static Context sAppContext = null;

這個(gè)sAppContext如果為null就用getApplicationContext獲取,典型的單例(但不是在構(gòu)造函數(shù)里初始化)。但只要你用static修飾Context,IDE還是會一直警告你"Do not place android context classes in static fields, this is a memory leak."

有人會說既然ApplicationContext只要app的進(jìn)程還在就會一直存在,就不會造成內(nèi)存泄露。這話對嗎?我感覺挺對的,只要你不像EP38里的例子一樣,把這個(gè)全局靜態(tài)context傳遞給單例的構(gòu)造函數(shù),也想不出什么會泄露內(nèi)存的場景。

但是我總覺得Android Studio警告不要把context用static修飾是有道理的。
stackoverflow上有人解釋說,為了避免內(nèi)存泄露,幾乎沒有任何必要使用靜態(tài)變量。常量可以用靜態(tài)的,因?yàn)樗鼈兊臄?shù)量和占據(jù)的空間都不多。

使用全局靜態(tài)Context是上一篇文章得到的一個(gè)方案,但是這樣還是會有一些問題的。6 THINGS YOU SHOULD KNOW的作者提出了以下幾點(diǎn)。

1. 會讓構(gòu)造參數(shù)的作用得不到發(fā)揮

Google’s Guide to Writing testable code說:

靜態(tài)的獲取全局變量并沒有將它們(全局變量)構(gòu)造函數(shù)和方法的依賴關(guān)系告訴給閱讀代碼的人。全局變量和單例通過API掩蓋了它們真實(shí)的依賴關(guān)系。如果想要真正理解依賴關(guān)系,開發(fā)人員必須逐行閱讀代碼。

比如你寫了一個(gè)方法叫作displayString (),如果你給它的構(gòu)造方法傳入一個(gè)Context 和一個(gè) String,那我們可能會推測你用了Context管理的某個(gè)方法來展示字符串,比如Toast。這也是構(gòu)造參數(shù)的一個(gè)指示作用。

說到這兒我不禁猜到為什么static方法/對象/變量/常量不需要用對象來調(diào)用了,因?yàn)閟taticstatic方法/對象/變量/常量一旦初始化就一直存在于內(nèi)存中,不會被GC,自然不需要每次都重新初始化一遍了。

2. 違反了封裝原則

這個(gè)說法聽起來有點(diǎn)牽強(qiáng)。
封裝保障了一個(gè)對象的行為只能被它的API所影響。但其實(shí)不用封裝也不會造成程序崩潰。

3. 不容易進(jìn)行單元測試

單元測試就是「對軟件中的最小可測試單元進(jìn)行檢查和驗(yàn)證」。比如C語言中的一個(gè)函數(shù),Java中的一個(gè)類,圖形化程序的一個(gè)界面,一個(gè)按鈕;這個(gè)最小單元是人為規(guī)定的。全局靜態(tài)Context破壞了單元測試。

Android單元測試都測些什么?
View/UI都不太好測,可以測數(shù)據(jù)庫、文件操作之類。

結(jié)論

不要使用全局靜態(tài)ApplicationContext,依賴外界注入。。雖然麻煩。

References:
[1]http://www.philosophicalhacker.com/post/what-should-we-unit-test/
[2]http://blog.csdn.net/hwz2311245/article/details/47731477
[3]http://www.itdecent.cn/p/03118c11c199

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,688評論 18 399
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,798評論 11 349
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,618評論 30 472
  • 停在這里不敢走下去,讓悲傷無法上演,下一頁你親手寫上的離別,由不得我拒絕。 有些東西,還擁有時(shí)便會忘記珍惜,久而久...
    陶泉閱讀 339評論 0 0

友情鏈接更多精彩內(nèi)容