3

我正在实现一个类,它的构造函数必须获取一些字符串作为参数,但我不知道这些字符串的数量。我可以在这里传递一个可变参数(字符串),但它是一个家庭作业,我们不能在我们的解决方案中使用任何类型的数组或其他不常见的库。(它应该是一个ArrayList或类似的东西,因为我们现在正在学习Collections-Framework)我想将一个List作为参数传递给构造函数,但是这个列表必须在之前填充,而且它很长..应该很简单.

所以第一个带有可变参数的解决方案(不被接受)应该是这样的:

public MyClass(String... myStrings) 
{
     for (String string : myStrings)
     {
          myStrings.add(string);
     }
}

所以它可以像这样使用,例如:

MyClass example = new MyClass("String1", "String2", "String3");

或者

MyClass example2 = new MyClass("String1", "String2");

第二个(有点复杂,因为之前应该“填充”列表):

public MyClass(List<String> myStrings) 
{
      myPlayers = myStrings;
}

(ps:myPlayer 是一个实例变量,然后会被初始化)

所以你有什么想法(像第一个但没有

4

2 回答 2

3

简而言之,我的解决方案是:

public MyClass(List<String> myStrings) 
{
      myPlayers = myStrings;
}

然后调用它:

List<String> items = new ArrayList<String>() {{ add("first"); add("second"); add("third"); }};
MyClass myClass = new MyClass(items);

不需要构建器,只需一个 ArrayList 的匿名子类,您将在其中调用 ArrayList 的 add 方法。这样您就可以轻松构建列表,而无需可变参数/数组。

于 2013-04-16T21:32:16.057 回答
3

对构建器模式进行一些研究。堆栈溢出问题中对此进行了很好的讨论,您何时使用构建器模式?.

如果您创建一个 StringListBuilder 类,您可以简单地拥有这样的方法签名:

MyClass(List<String> stringList) {/* ... */}

您可以使用您的构建器类调用构造函数,如下所示:

MyClass example = new MyClass(new StringListBuilder("first string").
        add("second string").add("third string").add("and so on").toList());

这将允许您构建任意大小的列表(包括空列表),而无需使用可变参数或数组。

于 2013-04-16T21:19:56.457 回答