Design question: Java Class with single method ok?
我需要以下功能
1
| Given two sorted lists, merge them |
我有这个骨架Java代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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 );
}
} |
这个方法类是正确的方法吗?我觉得几乎空无一人的班级正盯着我说这是个糟糕的设计。我最初把列表L3作为合并列表的私有成员,但后来我想,合并(l1,l2)可以用同一个对象多次调用,这要求l3是本地的才能合并(l1,l2)。我读到使用静态方法对代码的可重用性更糟糕。请告知。谢谢您。
- 很好。但我预测,一旦该类位于您的源代码库中,它将意外地开始增长其他方法。有一天,您希望合并两个以上的列表,因此它会为之增加一个方法。然后你想将一个列表合并到另一个列表中而不创建第三。然后,您需要排序,然后合并一些列表。很快,合并方法就不那么孤独了!
你可以这样做,但我认为你希望merge方法是static方法。这将确保在调用方法之前不必实例化它。你可以这样做:
1
| List l3 = MergeLists. merge(l1,l2 ); |
另外,如果这是唯一的方法,并且是静态的,那么可以使类abstract,这意味着它不能被实例化。
- …或使构造函数私有
- 没有构造函数。
- 我通常会使我的Util类成为最终类,并添加一个唯一的私有的no-op构造函数。这是为了禁止实例化和派生。
- 当然有:)隐含的。
- 请解释如何使隐式构造函数私有。提示:您可以通过向类中添加某个关键字来模拟这一点。
在这种情况下,由于没有真正的成员数据,将单个方法作为类内的静态方法将是适当的设计选择:
1 2 3 4 5 6 7 8 9
| public class ListUtils
{
public static List Merge (List l1, Listl2 )
{
List l3 = new List();
// merge l1 and l3 into l3
return l3 ;
}
} |
然后,您可以使用代码而不必创建类的实例(尤其是当它没有任何用途时):
1 2 3 4 5
| List l1 = new List();
List l2 = new List();
// Fill the lists
List merged = ListUtils. Merge(l1, l2 ); |
- 在Java中不能拥有顶级静态类。
- @再见-对不起。关键字快乐。固定的。
- 谢谢贾斯汀和埃里克。我试图将静态方法与选择的这个问题的答案协调起来,这个问题本质上说使用静态是一个坏主意:stackoverflow.com/questions/205689/…
- @用户426716-注意公认的答案"只有西斯才是绝对的"。他提到,在某些情况下,只有静态方法的类是有意义的。你的案子就是其中之一。
- 谢谢你,贾斯廷。
- @Justin+1用于星球大战参考^^
问题陈述:
Given two sorted lists, merge them
如何进行设计?-从分析问题陈述开始。哦,它有"列表"-名词-它有一个动作"合并"
所以"合并"是对列表对象执行的操作。所以它应该是列表的一部分。
由于存在特定语言Java的约束,WHO库已经具有列表类,需要创建另一个My.ExpLo.list吗?
进行方法合并(my.example.list其他列表)
- myFirstList.merge(mysecondList)
如果要合并多个列表以创建另一个新列表,可以设计一个使用var args mylistutil static list getmergedlist(list…列表列表)
如果您的问题是"我想合并两个列表"(这可能不是"设计"问题),那么解决方案可能是"使用已经具有该功能的XYZ实用程序类"。
静态方法不一定是坏的——它只取决于使用它们的上下文。出现这种情况的例子:
1 2
| File. separator; // a static representation of the file separator for your platform.
File. listRoots(); // list root filesystems |
现在,仅仅应用listutils的情况已经被讨论过了(请参阅其他答案),但是,您可能会做得更多,例如:
1
| class SortedList implements List<T> |
如果所有添加的项都自动排序到适当的位置,那么对于静态项来说就没有意义了,因为您希望结果存储在此实例中。如果在Eclipse下尝试这个方法,您会发现无论如何都需要覆盖相当多的方法,包括add和addAll,这相当于merge。
所以,我想说,这取决于你长期以来在做什么,以及物体应该如何动作。