设计问题:Java类与单方法OK?

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,这意味着它不能被实例化。


在这种情况下,由于没有真正的成员数据,将单个方法作为类内的静态方法将是适当的设计选择:

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);


问题陈述:

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下尝试这个方法,您会发现无论如何都需要覆盖相当多的方法,包括addaddAll,这相当于merge

所以,我想说,这取决于你长期以来在做什么,以及物体应该如何动作。