public String[] getValue(String keyName) {
ArrayList arraylist = (ArrayList) value.get(getKey(keyName));
String[] valueArray = new String[arraylist.size()];
for (int i = 0; i < valueArray.length; i++)
valueArray[i] = arraylist.get(i).toString();
return valueArray;
}
我想修改此功能以使其更易于使用。 如果返回String数组只包含一个元素。我希望它以String(非String数组)类型返回。
我怎样才能用Java做到这一点?
答案 0 :(得分:10)
好吧,你可以声明该方法返回Object
而不是String[]
...但这使得更难使用,而不是更容易。
考虑调用代码的外观,我想你会明白为什么实际上更简单一致。
当然,您总是可以创建自己的OneOrMany
界面来完成常见操作,并且可以包含单个元素或多个元素......但同样,我看不到其中的好处。 (我可以看到返回List<String>
或Iterable<String>
而不是数组的好处。)
public Collection<String> getValues()
{
...
}
public String getSingleValue()
{
// Throws an exception if there's more than one
}
后者可以 通过前一种方法,或者可能针对期望(和验证)单一结果的情况进行优化。
这样,在调用代码中非常清楚您期望的是什么以及为什么,并且期望得到验证。
我可能不会引入新接口,因为这意味着我要么必须包装现有的集合类,要么将它们子类化(argh)。在C#中很简单,因为您可以使用Single()
扩展方法(以及SingleOrDefault
,FirstOrDefault
等)...
答案 1 :(得分:5)
没有
如果有可能,您如何使用返回值?你会将它分配给哪种类型?
XXX foo = getValue(keyName);
^^^
What goes here?
答案 2 :(得分:3)
我参与的一个项目必须处理类似的事情。有一些类似地图的物体。每个键都有零个或多个值。但是有一些关键我们知道只有一个值。其他人最多只有一个。其他人有零或更多。
我们通过引入Collection
的扩展程序来解决这个问题:
public class CardinalityException extends RuntimeException {
...
}
public interface Values<T> extends Collection<T> {
/**
* @return the equivalent of iterator().next() if size() == 1
* @throws CardinalityException if collection is empty
* or contains more than one element.
*/
T unique() throws CardinalityException;
/**
* @return one element from the collection, or null if empty
*/
T one();
}
基本上,我们总是返回Values<T>
。如果调用者知道只有一个值,则只需使用unique()
或one()
,具体取决于值是否有效。
对于值的数量不重要的情况,我们只保留包装形式的值。