设计问题:使用单一方法的Java类可以吗?

问题描述:

我需要以下功能设计问题:使用单一方法的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

在这种情况下,因为你没有真正的会员数据,使得单一的方法的类中的静态方法将是一个适当的设计选择:

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://*.com/questions/205689/class-with-single-method-best-approach – snk 2010-09-08 17:27:08

你可以做到这一点,但我想你想的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

静态方法不一定是坏的 - 它只是取决于它们被使用的上下文。把我的头顶部哪里发生这种情况的例子:

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

所以,我要说这取决于你长期做什么以及对象应该如何行动。

问题陈述:

给定两个排序列表,将它们合并

如何去设计? - 从分析问题陈述开始。 - 哦,它有“清单” - 一个名词 - 哦,它有一个动作“合并”

  • 所以“合并” 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实用程序类已经具有该功能'