序言:我知道使用列表或其他集合来返回结果但是我必须通过列表来获取结果:参见第二个例子
Preamble-2:我正在寻找一个超出“Java不支持......”的答案。
我正在寻找一种从Java方法调用中返回多个对象的便捷方法。
有点像PHP:
list ($obj1, $obj2, ...) foobar();
我真的厌倦了在参数中传递持有者对象,例如:
class Holder {
int value;
}
Holder h1=new Holder();
Holder h2=new Holder();
然后:
o.foobar(h1,h2);
如果有人想出一个优雅的方法来解决这个问题,那将会非常感兴趣。
使用列表
List<String> = foobar();
这有两个缺点:
我必须首先将名单打包在房子的被叫方:
// this is on the callee side of the house
ArrayList<String> result = new ArrayList<String>
result.add("foo");
result.add("bar");
然后在来电者方面我必须把结果拿出来:
// This is on the caller side
List<String> result = foobar();
String result1 = result.get(0);
String result2 = result.get(1); // this is not as elegant as the PHP equivalent
此外,我想要返回不同类型的对象,比如说String,Integer我必须返回一个对象列表,然后转换每个对象......不太漂亮
感谢。
答案 0 :(得分:9)
使用通用元组类是我能想象到的最接近的类。为了给出一个想法,这样的三个返回值的通用类可能看起来像这样:
public class T3<A, B, C> {
A _1;
B _2;
C _3;
T3(A _1, B _2, C _3) {
this._1 = _1;
this._2 = _2;
this._3 = _3;
}
}
这允许被叫方一个语句构造函数,例如:
public T3<String, Integer, Character> getValues() {
return new T3<String, Integer, Character>("string", 0, 'c');
}
但是没有被调用者构建的持有者实例。
每个返回值都需要一个自己的元组类。 Functional Java library中可能会提供类似的内容。作为参考,这是一个N-Tuple implementation。
对于两值的情况,java.util.AbstractMap.SimpleEntry会这样做:
return new SimpleEntry<String, Integer>("string", 0);
无论如何,我认为多个返回值需要考虑两个要点:
尽管很无聊,但我建议创建一个单独的类来保存所有响应值,并将其声明为方法返回类型。这样就可以突出显示每个值的含义。
答案 1 :(得分:5)
你可以使用像这样的签名方法:
List<Holder> foobar();
答案 2 :(得分:4)
答案 3 :(得分:2)
返回扩展持有者似乎比返回List更好:
class Holder {
int value1;
String value2;
Holder(int value1, String value2) {}
}
Holder foobar() {
return new Holder(1, "bar");
}
答案 4 :(得分:2)
如果需要返回相同类型的多个值,则列表或集合是合适的。例如,将可变长度用户名列表作为List返回是完全有效的。如果你知道你总是会返回固定数量的值,我会使用一个数组。例如,在一种将某种用户ID作为三个不同的整数返回的方法中,我会使用:
public int[] getUserId(){
int[] returnArray = new int[3];
returnArray[0] = getFirstPart();
returnArray[1] = getSecondPart();
returnArray[2] = getThirdPart();
return returnArray;
}
在来电者代码中,获取值就像array[0]
,array[1]
和array[2]
一样简单。这比Collection更容易,并且你不会破坏任何东西,因为用户ID被定义为三个整数。
如果你真的需要返回多个不同的值,那么持有者类是最好的选择,没有别的办法。 Java不支持多个返回值。但我宁愿从设计的角度来看解决方案。如果一个类需要返回多个不同的值,那么它可能会做很多东西,其中一些与其他东西无关。单个代码(一个类,一个方法)应始终具有明确的目的和明确定义的职责。而是返回多个不同的值,我会考虑将方法拆分为多个更短的方法或定义一个接口来外部化所有功能。如果这些返回值以任何方式相关,并且如果拆开则没有意义,那么我认为他们应该自己上课。
答案 5 :(得分:1)
您可以使用任何Collection类来实现此目的。 Lesson可以帮助您确定最适合您的内容。