如何从函数返回多个值。

时间:2013-12-10 10:10:17

标签: java

这是一个逻辑问题,而不是特定于代码,我有二十个函数,每个函数计算两个我感兴趣的值。但是我只能从函数返回一个值。现在我的另一个选择是创建一个类并使用全局变量实现setter和getter。我想知道这是否是一种可行且推荐的方式?或者有更好的方法来做到这一点?

10 个答案:

答案 0 :(得分:3)

不要使用全局变量!使用一些将您的数据作为私有文件的类,并为其提供getter。喜欢

class Pair<A,B> {
    final A one;
    final B two;
    public Pair(A fst, B snd) { one = fst; two = snd; }
    public A getFst() { return one; }
    public B getSnd() { return two; }
}

然后你可以在其他地方说出类似的话:

    return new Pair(42, "a result");

答案 1 :(得分:1)

从您的函数中返回Collection,其中包含您感兴趣的值。

答案 2 :(得分:1)

您必须返回Listarray

但如果return类型不同,您可以创建自定义类并将其用作返回类型。

实施例

public class Result {
   private String name;
   private int age;

  // getters and setters;   
}

现在你可以有一些像下面这样的东西

public static Result getInfo(){
    Result result=new Result();
    result.setName("name");
    result.setAge(10);
    return result;//now you can have String and int values return from the method
}

答案 3 :(得分:1)

取决于问题。但有两种解决方案:

  1. 创建新类,所有这些函数都将返回实例。这个类对于每个需要的答案都有2个属性。
  2. 使用这2个答案返回数组或集合。

答案 4 :(得分:1)

你可以这样做

long[] function() {
    long[] ret = { a, b };
    return ret;
}

long[] a = { 0 }, b = { 0 };

void function(long[] a, long[] b) {
    a[0] = ...
    b[0] = ...

或向对象添加属性。

private long a,b;

void function() {
    a = ...
    b = ...
}

在最后一种情况下,你可以估价。

class Results {
    public final long a;
    public final Date b; // note: Date is not immutable.
    // add constructor
}

public Results function() {
    long a = ...
    Date b = ...
    return new Results(a, b);
}

答案 5 :(得分:1)

我认为制作记录类是最合适的。

public class Record {
    public final int a;
    public final int b;

    public Record(final int a, final int b) {
        this.a = a;
        this.b = b;
    }
}

然后您的函数可以返回Record类型,您可以使用record.arecord.b来访问它。

这也是为数public个变量而且没有任何getter和setter可以证明其合理性的少数情况之一。

更新:已实施建议的更改,现在所有内容都为final,这意味着当您将其恢复时无法修改Record,这似乎符合期望。您想要结果并使用它们。

答案 6 :(得分:1)

有很多方法:集合,数组...... 在我看来,唯一的方法是用这些值定义一个类。 如果您不需要调节内容的可见性,则不需要getter和setter方法

class MyReturnValue {
  public int a;
  public int b;
}
你的代码中的

...
MyReturnValue result=new MyReturnValue();
result.a=5;
result.b=6;

return result;

答案 7 :(得分:1)

最好创建一个类并使用全局变量实现setter和getter而不是Return Collection,这取决于你的用途。

答案 8 :(得分:1)

采用带有通用辅助函数的varargs来解决返回变量限制的数量怎么样:在这个解决方案中,每当返回变量的数量发生变化时,我们就不必声明新的类了

class Results
{
    private final Object[] returnedObj;

    public Results(Object... returnedObj) 
    {
        this.returnedObj = returnedObj;
    }

    public <E> E getResult(int index)
    {
        return (E)returnedObj[index];
    }


}

测试案例

public static Results Test()
{
        return new Results(12, "ABCD EFG", 12.45);
             // or return larger number of value
}

//// And then returning the result

Results result = Test();
String x = result.<String>getResult(1);
System.out.println(x); // prints "ABCD EFG"

答案 9 :(得分:0)

如果您确定“〜”不会出现在结果中,您甚至可以返回由特殊字符分隔的值,如“〜”。