2009-10-23 38 views
1

我想知道您的意見,您發現是一種更好的方法,可以使用不同的方法填充列表。我知道沒有明確的答案,但我希望看到合理的利弊。填寫Java列表的方法

接近1

private List<Snap> snapList; 
snapList = getSnapList(); 

方法2.

private List<Snap> snapList = new ArrayList<Snap>(); 
fillSnapList(snapList); 

感謝, 馬加什

+0

這應該是社區wiki。 – IAdapter

回答

3

我比方法2更喜歡方法1,因爲列表實際上是您調用的方法的輸出。方法1使得比方法2更清楚。

此外,方法1給予該方法返回不可修改列表的機會。如果列表應該填充一次,並且以後不應該修改,則可能需要這樣做。 Java不是一種函數式編程語言,但第一種方法更多的是函數式編程風格而不是第二種方法(在函數式編程中,不變性和避免可變狀態是重要的想法 - 這些中的一個重要優點是它們使併發編程更容易,這在非函數式編程語言中也很有用)。

+0

嘿,非常好的論點......和愛的功能觀點:) – helios

6

爲什麼不按照Java API的Collections類,使你的填充方法是靜態的(如果它是有意義的並且獨立於對象狀態)。

Collections.fill(mylist, 0); 

MyListFiller.fill(myList, args); 

在任何情況下,創造一個填料接口有道理的,如果補法計劃改變。如果你不是真的「填充」,但返回某種類型的對象狀態,只需讓給定的方法構建List並返回它。對於第一種選擇

public List<Object> getMyStuff() 
{ 
//build and return my stuff 
} 
+0

我喜歡靜態方法的想法。然而,我被卡住了,因爲我想有一個可以利用依賴注入的fill方法的接口。但是我不能在接口中定義靜態方法。你有什麼建議? – Matyas

+0

使用填充方法制作填充界面。它與單個靜態類的工作方式大致相同。填充填充而不是MyFiller.fill。 –

1

一個con是,你已經選擇方法名(getSnapList())通常被認爲是一個簡單的訪問,即對現場snapList返回參考。在你的設計中,暗示你將創建列表,如果它不存在並填充數據,這會給正常的習慣用法帶來副作用。

由於這個原因,最好是明確的,我更喜歡第二個選項。

3

這取決於情況。

getSnapList()的方法是在像下列情況下適當:

  1. 你寫不希望關心列表來自哪裏的方法。
  2. 的方法不應該知道什麼樣的名單,它變得 - 例如,如果你想改變使用LinkedList,那麼你就可以做到這一點在getSnapList(),而不是所有的調用fillSnapList()方法。
  3. 你只會想要填寫新列表。

fillSnapList()的方法是在像下列情況下適當:

  1. 您可能需要填充列表超過一次。
  2. 您可能想要改變列表的填充方式(即放入的內容)。
  3. 你需要填寫別人交給你的清單。
  4. 您需要在多個類或對象之間共享該列表,並且您可能需要在其使用壽命的某個點重新填充它。
0

我更喜歡方法#1,因爲方法可以被希望使用不同List實現的子類覆蓋。另外,我認爲將工廠方法命名爲getter會令人困惑,我寧願將其命名爲newSnapList()或createSnapList()。