java - 在一个函数调用中返回两个结果?

时间:2012-02-17 23:04:38

标签: java

我正在尝试做这样的事情:

 public void <String,int> getItem
 { 
   return <"Jen",23>;
 }

我知道我可以使用自定义类,但是如何在一次函数调用中返回两个结果。

1 - java中是否可以使用上述模板函数,调用者将如何获取它的第1部分和第2部分。

2 - 我可以使用关于动作的关联数组吗?

3 - 我可以使用某种散列图吗?

4 - 有什么其他可能的方式

我尝试了所有三种方式,但是这种或那种语法正在打击我。所以,如果有人能提供明确的例子

8 个答案:

答案 0 :(得分:10)

Java函数始终返回单个值,因此您唯一的选择是返回包含多个值的“集合”对象,例如数组或正确的Collection。例如:

public Object[] getItem() { return new Object[] { "Jen", 23 }; }
public Collection<Object> { return Arrays.asList("Jen", 23); }

虽然,Java中的典型模式是返回一个封装您的值的自定义类型,例如:

public class NameAge {
  public final String name;
  public final int age;
  public NameAge(String name, int age) {
    this.name = name;
    this.age = age;
  }
}
// ...
public NameAge getItem() { return new NameAge("Jen", 23); }

或更一般地说:

public class Pair<X, Y> {
  public final X x;
  public final Y y;
  public Pair(X x, Y y) {
    this.x = x;
    this.y = y;
  }
}
// ...
public Pair<String,Integer> getItem() {
  return new Pair<String,Integer>("Jen", 23);
}

当然,如果要将这些自定义类型用作哈希键,则会对哈希(相等和哈希码)产生严重影响。

答案 1 :(得分:4)

我喜欢使用泛型!创建自己的类并返回它的实例:

public class Tuple<T,V>
{
  public T item1;
  public V item2;
  public Tuple(T i1, V i2)
  { 
     item1 = i1;
     item2 = i2;
  }
}

然后你创建你的方法:

public Tuple<String, int> getItem()
{
   return new Tuple<String, int>("Jen", 23);
}

答案 2 :(得分:1)

Java不允许多个return语句。我认为最好的做法是创建一个自定义对象。你在这里有什么建议人类,一个la

public class Person {
  int Age;
  String Name;
}

返回一个对象会使你的行为更加直观。

答案 3 :(得分:1)

你可以返回一个Bundle。

public Bundle getItem(){
   Bundle theBundle = new Bundle();
   theBundle.putString("name","Jen");
   theBundle.putInt("age",23);
   return theBundle;
}

答案 4 :(得分:1)

正确的方法是为你的回归集创建一个类:

public class ReturnSet {
    private String str;
    private int num;

    public ReturnSet(String _str, int _num) {
        str = _str;
        num = _num;
    }

    //add getters and setters
    ...
}

然后你的功能看起来像

public ReturnSet getItem() {
    ...
    return new ReturnSet(strValue, intValue);
}

当然,你可以通过让你的函数返回一个Object的数组来捏造东西,但这将是一个相当糟糕的代码:

public Object[] getItem() {
    Object[] result;
    //allocate it, get data;
    ...
    result[1] = strValue;
    relult[2] = new Integer(intValue);
    return result;
}

你甚至可以返回一个包含一个元素的hashmap:

public Map getItem() {
    Map result;
    //allocate it, say as hashmap, get data;
    ...
    result.put(strValue, new Integer(intValue));
    return result;
}

然后在调用者中,地图的键将是第一部分,值将是第二部分。

虽然可能有很多方法可以做到这一点,但第一种方法是正确的做法。

答案 5 :(得分:1)

通常,如果您需要从一个函数返回两个值 - 它是code smell。尝试重构代码,以便每个函数始终只返回一个值。请记住,没有返回值(void)也是代码气味,但不太重要。

答案 6 :(得分:0)

如果一个方法返回一些东西,那么它的返回类型必须是这样的:

public MyCustomObject getItem();

public Object[] getItem():

或其他任何可以存储结果的内容。

但Java是一种静态类型的OO语言。自定义课程是要走的路。

答案 7 :(得分:0)

您还可以使用“return”参数以常规方式和其他方式返回一个值:

class C {
    Type2 value; // omitted getter and setter for brevity
}
Type1 f1(C returnParameter, String otherParameters...)
{
    // function body here
    returnParameter.value=returnValue2; // store the second result
    return returnValue1; // return the first result
}

// usage
Type1 result1;
Type2 result2;
C helper = new C();
result1=f1(helper, "foo", "bar");
result2=helper.value;

要获得更多结果,请使用多个“辅助”对象或可以容纳多个值的对象。

我自己正在寻找一个最优雅的解决方案(在我的情况下,一个返回类型是一个集合,另一个是整数 - 任何变体都可以)。