2010-09-08 26 views
4

我需要以下功能設計問題:使用單一方法的Java類可以嗎?

Given two sorted lists, merge them 

我有這樣的框架的Java代碼:

public class MergeLists{ 
    public List merge(List l1, List l2){ 
     List l3; 
     // merge l1, l2 in to l3 
     return l3; 
    } 

    public static void main(){ 
     // populate list1 and list2 
     MergeLists ml = new MergeLists(); 
     List l3 = ml.merge(l1,l2); 
    } 
} 

這是一個方法類是正確的做法?我覺得幾乎空洞的班級正盯着我說這是糟糕的設計。我最初有List L3作爲MergeLists的私有成員,但後來我認爲merge(l1,l2)可以用相同的對象多次調用,這需要l3爲本地合併(l1,l2)。 我讀過使用靜態方法對代碼重用性更差。請指教。謝謝。

+1

沒關係。但我預測,一旦這個課程在你的源代碼中,它會意外地開始發展其他方法。有一天,你想合併兩個以上的列表,所以它增加了一個方法。然後你想將一個列表合併到另一個列表中而不創建第三個列表。然後你想排序然後合併一些列表。很快,合併方法並不那麼孤單! – 2010-09-08 18:14:58

回答

3

在這種情況下,因爲你沒有真正的會員數據,使得單一的方法的類中的靜態方法將是一個適當的設計選擇:

public class ListUtils 
{ 
    public static List Merge(List l1, Listl2) 
    { 
     List l3 = new List(); 
     // merge l1 and l3 into l3 
     return l3; 
    } 
} 

然後,您可以使用代碼,而無需創建您的類的實例(特別是當它沒有用處):

List l1 = new List(); 
List l2 = new List(); 
// Fill the lists 

List merged = ListUtils.Merge(l1, l2); 
+0

您不能在java中擁有頂級靜態類。 – aioobe 2010-09-08 17:25:30

+0

@aioobe - 對不起。有關鍵字高興。固定。 – 2010-09-08 17:26:23

+0

謝謝Justin和Erick。我試圖調和靜態方法與這個問題的選擇答案,基本上說,使用靜態是一個壞主意:http://stackoverflow.com/questions/205689/class-with-single-method-best-approach – snk 2010-09-08 17:27:08

4

你可以做到這一點,但我想你想的merge方法是static。這將確保您在調用方法之前不必實例化它。你可以這樣做:

 
List l3 = MergeLists.merge(l1,l2); 

此外,如果這是唯一的方法,它是靜態的,可以使類abstract這意味着它不能被實例化。

+3

...或使構造函數私人 – Stroboskop 2010-09-08 17:24:53

+0

沒有構造函數。 – 2010-09-08 17:26:02

+0

我通常使我的util類最終並添加一個獨特的私人空操作構造函數。這是爲了禁止實例化和派生。 – gawi 2010-09-08 17:34:22

0

靜態方法不一定是壞的 - 它只是取決於它們被使用的上下文。把我的頭頂部哪裏發生這種情況的例子:

File.separator; // a static representation of the file separator for your platform. 
File.listRoots(); // list root filesystems 

現在,你在哪裏只需將您的listutils已被覆蓋的情況下(見其他答案),但是,你可能會做更多,例如:

class SortedList implements List<T> 

,所有添加的項目自動排序到位 - 因此,它沒有任何意義,因爲你想要的結果存儲在這種情況下,項目是靜態的。如果你在eclipse下試用這個,你會發現你需要重寫相當多的幾個方法,包括addaddAll,這相當於merge

所以,我要說這取決於你長期做什麼以及對象應該如何行動。

0

問題陳述:

給定兩個排序列表,將它們合併

如何去設計? - 從分析問題陳述開始。 - 哦,它有「清單」 - 一個名詞 - 哦,它有一個動作「合併」

  • 所以「合併」 ING要一個List對象上進行的操作。所以它應該是List的一部分。

  • 由於存在特定語言Java的約束,whos庫已經有List類,需要創建另一個my.example.List?

  • 有一個方法合併(my.example.List其他列表)

  • myfirstList.merge(mySecondList)

如果你想多個列表進行合併,創建另一個新的列表,你可以設計一個採用var-args的util類MyListUtil {static List getMergedList(List ... listOfLists)

如果你的問題是「我想合併兩個列表」(這可能不是'設計'問題),那麼也許解決方案將是'使用xyz實用程序類已經具有該功能'