5

序言:我知道使用列表或其他集合来返回结果,但是我必须通过列表来提取结果:参见第二个示例

序言 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,我将不得不返回一个对象列表,然后强制转换每个对象......不漂亮

谢谢。

4

6 回答 6

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');
}

但是被调用者不进行任何持有者实例构造。

每个返回值的数量都需要一个自己的元组类。功能 Java 库中可能提供了类似的东西。作为参考,这里有一个N-Tuple implementation

对于二值情况 java.util.AbstractMap.SimpleEntry 会做:

return new SimpleEntry<String, Integer>("string", 0);

无论如何,我看到多个返回值需要考虑的两个要点:

  1. 键入的返回值
  2. 指出每个返回值的含义

尽管很无聊,但我建议创建一个单独的类来保存所有响应值并将其声明为方法返回类型。这样可以突出显示每个值的含义。

于 2012-05-13T22:13:32.473 回答
5

您可以使用带有这样签名的方法:

List<Holder> foobar();
于 2012-05-13T19:26:26.743 回答
4

你能返回一个List, Set, 或Map吗?

于 2012-05-13T19:25:49.153 回答
2

返回一个扩展的 Holder 似乎比返回一个 List 更好:

class Holder {
    int value1;
    String value2;
    Holder(int value1, String value2) {}
}

Holder foobar() {
    return new Holder(1, "bar");
}
于 2012-05-13T20:10:49.730 回答
2

如果您需要返回多个相同类型的值,则 List 或 Set 是合适的。例如,将可变长度的用户名列表作为列表返回是完全有效的。如果你知道你总是要返回固定数量的值,我会使用一个数组。例如,在一个将某种用户 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 不支持多个返回值。但我宁愿从设计的角度来看解决方案。如果一个类需要返回多个不同的值,那么它可能会做很多事情,其中​​一些与其他无关。一段代码(一个类、一个方法)应该总是有一个明确的目的和明确定义的职责。与其返回多个不同的值,我会考虑将方法拆分为多个较短的方法或定义一个接口来外部化所有功能。如果这些返回值以任何方式相关并且如果分开就没有意义,那么我认为它们应该单独上一堂课。

于 2012-05-13T20:59:18.720 回答
1

为此,您可以使用任何Collection类。课程可能会帮助您确定最适合您的方法。

于 2012-05-13T19:37:23.897 回答