0

我在学习 morphadorner 操作时遇到了一段有趣的代码。代码如下:

Collection<Object>[] nodes = someFunction()  

我的问题是在什么情况下这个声明是必要的和/或有效的:

Collection<Object>[] nodes

我见过:

Collection<Object[]> nodes

但想不出我需要一个Arrayof的场景Collections。那么问题来了,什么时候会用到它?

这是javadoc

java.util.Set<java.lang.String>[] 

findNames(java.lang.String text)
      Returns names from text.
4

3 回答 3

3

首先,

Collection<Object[]> nodes;

Collection<Object>[] nodes;

是两个不同的东西。第一个是数组的集合,而第二个是集合的数组。

至于何时使用后者,我的回答是“很少”。虽然从概念上讲这很简单,但 Java 数组和泛型不能很好地配合使用

因此更常见的是看到

ArrayList<Collection<Object>> nodes;

这很相似,但更容易处理。

至于是否findNames()是一个好的设计示例,我的主要反对意见是完全不可能从函数签名中猜测数组的元素应该代表什么(或有多少)。出于这个原因,我会做不同的事情,可能会返回一个带有两个明确命名的访问器的自定义类。

于 2013-03-26T15:49:01.560 回答
1

代码可以编译,因此它可能是有效的 Java。

当设计师想不出更好的解决方案时,这是必要的。

这给我们留下了:这是好的设计吗?

也许但可能不是。一种情况是函数总是返回两个或三个集合(即多个集合,但数量永远不会改变)。

您可以为此创建一个对象,但由于这是 Java,这将需要很多很多行致命的无聊代码。这也意味着您必须为每个集合想出一些有用的名称。

考虑到您发布的 JavaDoc,数组的数量似乎取决于文本中的句子数量。

所以在这种情况下,我会返回 a Listof Collections (因为句子的顺序永远不会改变,你可能想通过索引来获取它们)。

设计师可能会争辩说您可以将元素添加到列表中,但不能添加到数组中,但我会使用不可修改的列表。

所以在这个例子中,我会说这是一个糟糕的设计。

于 2013-03-26T15:48:19.527 回答
0
Collection<Object>[] nodes

是有效的,因为这意味着我们得到一个arrayof Collection<Object>。然而,

Collection<Object[]> nodes

意味着我们得到一个Collection包含arraysObjects

我的问题是在什么情况下这个声明是必要的和/或有效的:

考虑当你有不同setobjects说法(人)时的情况。每个人都set属于特定国家的人民。我们创建一个指定大小的数组set。在这种情况下,我们使用以下语法:

Set<People>[] setOfPeople = new TreeSet<People>[5]; // We want to consider people of 5 different countries.
于 2013-03-26T15:51:48.620 回答