編程經驗之考慮靜態工廠方法

前言

安卓中的基本問題之一就是對鍵/值對的持有。由於bundle 須要鍵/值對,因此你老是須要一個key。然而問題是哪裏保存這些key?html

圖片描述

解決的辦法

1.每一個fragment,activity建立相同的key

好比你想從LoginActivity 傳遞數據到LoginFragment。你在兩個類中中都持有相同的key。
Cons: 重複了,並且容易產生書寫錯誤。java

2.把key放在一個類但能夠在任何地方訪問到

好比:LoginActivity.KEY_FOO。android

Cons:這會製造一個耦合並且類老是必須知道要調用哪一個key。這也可能影響到系統。假定你誤用了另一個key。spa

3.全部key都放在一個類中

好比Constants.java指針

Cons: 我認爲這是三者中最糟糕的。全部的類都將和這個類耦合而且一個小錯誤就會影響到整個系統。不久由於太多的key會輕易失去控制。code

那麼,該怎麼辦呢?htm

靜態工廠方法

與其建立另外一個類的對象,不如讓對應的類本身建立對象。對象

HomeActivity 本身負責建立本身的intent。圖片

圖片描述

調用者類無需知道intent以及key的任何事情。LoginActivity 只需告訴HomeActivity,"嘿,我須要一個帶有這個數據的intent"。就是這樣,HomeActivity 會作完其它的事情。get

圖片描述

相同的原理也應用到fragments 上。咱們都知道不該該使用非默認的構造器來傳遞數據。主要的緣由是當fragment 被重建的時候( config changes 或者旋轉的時候),會用到默認的構造器並且會丟失數據。因此你須要找到修復它的方法。

而有了靜態工廠方法,就有了一個簡潔的方法來避免這個問題。建立一個方法來傳遞變量,把它們放到一個bundle 中而後設置給fragment。

圖片描述

靜態工廠方法在null條件下的應用

咱們須要把一個對象拷貝到另外一個對象,而有些字段多是null的。

在下面的代碼中,若是 response.getUserResponse() 是null。由於User 的構造方法使用了它,它會拋出一個空指針異常。

圖片描述

User 類老是但願一個非空的對象。

一種辦法是在建立對象的時候在Account 類中檢查一下。

圖片描述

這讓代碼顯得有點醜陋並且可讀性差。想象一下你有許多這樣的狀況,你老是須要檢查一下。

另外一個辦法是在User 中作判空檢查。

圖片描述

可是若是你仔細點就會注意到,這裏的問題是咱們會獲得一個field全爲空的新對象。這確定會在別的地方引發crash 。

簡潔的解決辦法來自於靜態工廠方法。咱們基本就是使用newUser 方法首先檢查response ,若是response 無效咱們僅返回null而不建立一個新的對象。而若是response 有效則返回一個新的user 對象。

圖片描述

你也能夠作其它方面的驗證,好比其中一個變量爲空你就不想建立一個新的對象等。

咱們大量的使用靜態工廠方法而且從中得到了不少好處。

  • 簡潔

  • 低耦合

  • 對應的類在建立以前能夠先作驗證。

  • 對應的類可使用單例模式返回現有的對象而不建立一個新的對象。

  • 對應的類能夠建立一個子類並返回。

總之,對應的類老是可以作正確的事情。

來源:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0922/3494.html

相關文章
相關標籤/搜索