我最近讀到StackOverflow上面關於Fragment實例化的一個問題,以爲挺有趣的。html
new MyFragment()和MyFragment.newInstance()之間的差異是什麼?應該用哪一個呢?android
好問題。答案就是這篇文章的題目所建議的,這是一種合理的設計。在這種狀況下,newInstance()方法是一種「靜態工廠方法",讓咱們在初始化和設置一個新的fragment的時候省去調用它的構造函數和額外的setter方法。爲你的Fragment提供靜態工廠方法是一種好的作法,由於它封裝和抽象了在客戶端構造對象所需的步驟。例如,考慮下面的代碼:函數
1 public class MyFragment extends Fragment { 2 3 /** 4 * 靜態工廠方法須要一個int型的值來初始化fragment的參數, 5 * 而後返回新的fragment到調用者 6 */ 7 public static MyFragment newInstance(int index) { 8 MyFragment f = new MyFragment(); 9 Bundle args = new Bundle(); 10 args.putInt("index", index); 11 f.setArguments(args); 12 return f; 13 } 14 }
不要讓客戶端去調用默認的構造函數,而後手動地設置fragment的參數。咱們直接爲它們提供一個靜態工廠方法。這樣作比調用默認構造方法好,有兩個緣由:一個是,它方便別人的調用。另外一個是,保證了fragment的構建過程不會出錯。經過提供一個靜態工廠方法,咱們避免了本身犯錯--咱們不再用擔憂不當心忘記初始化fragmnet的參數或者沒正確設置參數。
總的來講,雖然二者的區別只在於設計,可是他們之間的差異很是大。由於提供靜態工廠方法有向上抽象了一個級別,讓代碼更容易懂。spa
譯者注:其實提供靜態工廠而不是使用默認構造函數或者本身定義一個有參的構造函數還有相當重要一點。fragmnet常常會被銷燬從新實例化,Android framework只會調用fragment無參的構造函數。在系統自動實例化fragment的過程當中,你沒有辦法干預。一些須要外部傳入的參數來決定的初始化就沒有辦法完成。使用靜態工廠方法,將外部傳入的參數能夠經過Fragment.setArgument保存在它本身身上,這樣咱們能夠在Fragment.onCreate(...)調用的時候將這些參數取出來。設計