设计问题:使用单一方法的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)。 我读过使用静态方法对代码重用性更差。请指教。谢谢。
在这种情况下,因为你没有真正的会员数据,使得单一的方法的类中的静态方法将是一个适当的设计选择:
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);
你可以做到这一点,但我想你想的merge
方法是static
。这将确保您在调用方法之前不必实例化它。你可以这样做:
List l3 = MergeLists.merge(l1,l2);
此外,如果这是唯一的方法,它是静态的,可以使类abstract
这意味着它不能被实例化。
...或使构造函数私人 – Stroboskop 2010-09-08 17:24:53
没有构造函数。 – 2010-09-08 17:26:02
我通常使我的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下试用这个,你会发现你需要重写相当多的几个方法,包括add
和addAll
,这相当于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实用程序类已经具有该功能'
没关系。但我预测,一旦这个课程在你的源代码中,它会意外地开始发展其他方法。有一天,你想合并两个以上的列表,所以它增加了一个方法。然后你想将一个列表合并到另一个列表中而不创建第三个列表。然后你想排序然后合并一些列表。很快,合并方法并不那么孤单! – 2010-09-08 18:14:58