【问题标题】:Alternative to Varargs可变参数的替代品
【发布时间】:2013-04-09 10:38:03
【问题描述】:

我正在实现一个类,它的构造函数必须获取一些字符串作为参数,但我不知道这些字符串的数量。我可以在这里传递一个可变参数(字符串),但它是一个家庭作业,我们不能在我们的解决方案中使用任何类型的数组或其他不常见的库。 (它应该是一个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 是一个实例变量,随后会被初始化)

那么你有什么想法吗(像第一个但没有

【问题讨论】:

  • String[] 首先是一个数组,(我们不能在这个作业中使用数组,所以我们也不能使用 varargs)并且它必须像我的第二个解决方案一样使用列表
  • 第二个有什么问题?如果填充确实是一种选择,请使用 Arrays.asList(...) (是的,我知道它是一个数组/可变参数。我只是在这里看不到“复杂”的部分。
  • 所以在主类(及其'主方法)中,我必须创建一个 ArrayList,用不同的字符串填充它,然后以该列表作为参数启动一个新游戏。我认为拥有类似于第一个解决方案的东西(如可变参数,但带有列表)非常简单,但似乎没有适合我的目标的东西。

标签: java arrays list collections variadic-functions


【解决方案1】:

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

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 方法。这样您就可以轻松构建列表,而无需可变参数/数组。

【讨论】:

  • Erik,你能指出一个定义该语法的页面吗?看起来很有趣,但我找不到描述这种结构的页面。
  • Arkanon,你的意思是这样的吗? c2.com/cgi/wiki?DoubleBraceInitialization
  • @ErikPragt 谢谢,这证实了我的想法。我不得不说你的解决方案更好,因为它只使用本机语法提供了所需的功能。
  • 我本来想说你应该只做List&lt;String&gt; items = Arrays.asList("first", "second", "third");,但后来意识到OP“不能使用可变参数”。然后我想List&lt;String&gt; items = Arrays.asList(new String[]{"first", "second", "third"});,但后来意识到OP“也不能使用数组”!太可笑了!
【解决方案2】:

对构建器模式进行一些研究。在 Stack Overflow 问题 When would you use the Builder Pattern? 中有很好的讨论。

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

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

您可以像这样使用构建器类调用构造函数:

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

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

【讨论】:

  • 当然,但是你可以(更容易)做 List x = new ArrayList() {{ add("first");添加(“第二”);添加(“第三”); }};如果这真的是个问题。
  • 感谢您的回答 Arkanon。我认为这是对我的问题最合适的答案。但我将使用其他解决方案,因为我认为现在实施起来更快。非常感谢!
  • @KarimBelkhiria 谢谢,但我认为您应该接受 Erik Pragt 的回答,因为它更优雅,并且不需要创建任何额外的基础设施类。
  • 我做到了!但以前不能这样做,因为当它是一个真正的新答案时,Stackoverflow 不允许接受它..所以我等了几分钟后接受了它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2014-12-20
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多