我最近讀到StackOverflow上面關于Fragment實例化的一個問題,覺得挺有趣的。
new MyFragment()和MyFragment.newInstance()之間的差別是什么?應該用哪個呢?
好問題。答案就是這篇文章的題目所建議的,這是一種合理的設計。在這種情況下,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的參數或者沒正確設置參數。
總的來說,雖然兩者的區別只在于設計,但是他們之間的差別非常大。因為提供靜態工廠方法有向上抽象了一個級別,讓代碼更容易懂。
譯者注:其實提供靜態工廠而不是使用默認構造函數或者自己定義一個有參的構造函數還有至關重要一點。fragmnet經常會被銷毀重新實例化,Android framework只會調用fragment無參的構造函數。在系統自動實例化fragment的過程中,你沒有辦法干預。一些需要外部傳入的參數來決定的初始化就沒有辦法完成。使用靜態工廠方法,將外部傳入的參數可以通過Fragment.setArgument保存在它自己身上,這樣我們可以在Fragment.onCreate(...)調用的時候將這些參數取出來。
文章列表
留言列表