2013-08-16 30 views
1

我正在研究一個使用this示例作爲基礎的應用程序。向下滾動到名爲「DetailsFragment」的類。你會看到這個方法:這個方法爲什麼是靜態的?

public static DetailsFragment newInstance(int index) { 
    DetailsFragment f = new DetailsFragment(); 

    // Supply index input as an argument. 
    Bundle args = new Bundle(); 
    args.putInt("index", index); 
    f.setArguments(args); 

    return f; 
} 

爲什麼這個方法是靜態的?無法這樣做就像一個普通的構造是這樣的:

public DetailsFragment(int index) { 
    Bundle args = new Bundle(); 
    args.putInt("index", index); 
    this.setArguments(args); 
} 

然後當你需要的對象只是去:

DetailsFragment f = new DetailsFragment(somevalue); 

我不明白爲什麼這個方法是靜態的。

+0

相關:http:// stackoverflow。com/questions/929021/what-are-static-factory-methods-in-java – zapl

回答

4

爲什麼此方法是靜態的?不能這樣做像這樣的常規構造函數

基本上第一種方法是使用static factory method。在這種情況下,可能沒有區別。您可以在構造函數中編寫相同的代碼。那麼,實際上會有一個Android特定的問題,正如@zapl的評論中所指定的那樣。如果您提供自己的參數化構造函數,那麼編譯器將不會提供默認構造函數。如註釋中所述,每個Fragment必須具有默認構造函數。

但是,一般來說,使用靜態工廠方法有幾個好處。其中一些是:

  • 您可以實現singleton pattern靜態工廠方法
  • 靜態工廠方法可以返回你的任何子類的實例。

關於這個話題,你可以在有效的Java書找到的最好的參考 - 第1項,我已經下面鏈接。

參考:

+1

還有一個特定於Android的原因:每個'Fragment'都必須有一個沒有參數的公共構造函數,因此係統可以(重新)創建它們。 – zapl

+1

@zapl。哦!是的,這也是一個問題。編譯器不會創建默認構造函數,只要我們明確提供參數化構造函數。 –

+0

啊 - 感謝Rohit和zapl。我意識到靜態的一些用途,但我沒有意識到這是因爲zapl在這個特定情況下所說的。 我正在努力將本示例中的DetailsFragment擴展爲可插入各自ActionBarSherlock選項卡的三個不同片段。 – CupOfQuestions

1

這兩種方法在這種情況下是可能的,同樣出色。

+0

對不起,我編輯刪除了「返回這個」之前,你擊中提交:)(對於那些看到這一點,我有一個在上面的常規構造函數返回) – CupOfQuestions

0

我不確定爲什麼在創建DetailsFragment實例時創建Bundle對象。我們可以在DetailsFragment類中分離兩者。

0

你可以使用DetailsFragment(int index),它只能由你調用。在你的情況下,這是沒有問題的,因爲你使用setArguments而不是class-vars。

爲什麼它是一個使用newInstance的模式?

如果您的操作系統殺死了您的Fragment,並且下次您的Fragment將被恢復,則只會調用Default-Constructor。 DetailsFragment(int index)不會被操作系統再次調用。然而,你設置的參數可能永遠存儲在內存中,儘管你的片段已經被殺死了一次。

相關問題