从java方法返回两个值

时间:2012-07-04 03:25:00

标签: java oop coding-style

假设我在java中有一个方法,它在数据库中查找用户并返回他们的地址和他们所在的团队。

我想从方法中返回两个值,并且不希望将方法拆分为两个,因为它涉及数据库调用,并且拆分涉及调用次数的两倍。

考虑到中到大型软件项目的典型问题,最佳选择是什么?

whatGoesHere getUserInfo(String name) {
  // query the DB
}

我知道这个问题与现有的问题有些重复,但是每个问题都有一些因素使得它与这个例子不同,我觉得值得再次提问。

6 个答案:

答案 0 :(得分:9)

你有一些选择。 最大的OOP将创建一个类来封装这两个属性,就像那样

private class UserInfo {
  private Address address;
  private Team team;
}

或者,如果您想要一个简单的解决方案,您可以返回一个对象数组:

Object[] getUserInfo(String name) {
  // query the DB
  return new Object[]{address,team};
}

或者,如果您想将此方法公开给某个库,您可以使用某些接口来使用这些属性,如下所示:

class APIClass{
  interface UserInfo{
    public Address getAddress();
    public Team getTeam();
  }

  UserInfo getUserInfo(String name) {
    // query the DB
    return new UserInfo(){
         public Address getAddress(){ return address; }
         public Team getTeam(){ return team; }
    };
  }
}

答案 1 :(得分:0)

无法获得地图帮助,A MultivalueMap。其中键是用户名,2个值是地址和团队名称。我假设你的地址和团队都是字符串变量,你可以在这里了解更多关于多值地图的信息

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiValueMap.html

http://apachecommonstipsandtricks.blogspot.in/2009/01/multi-value-map-values-are-list.html

答案 2 :(得分:0)

首先很好地模拟你的抽象,关系和多样性(参见下面的例子)。然后,您可以相应地建模表。执行这两个步骤后,您可以利用可以配置为加载对象图的JPA,也可以编写JDBC代码并通过运行带有正确SQL JOIN的SQL查询来创建自己的图形。

  • 用户有地址
  • 一个团队可以拥有一个或多个用户(用户可以为更多团队玩吗?)

答案 3 :(得分:0)

您可以返回包含用户名和组名的String数组。该方法如下:

public String[] getUserInfo(String name) {
    String[] result = new String[2];
    // query the DB
    ...
    result[0] = userName;
    result[1] = groupName;

    return result;
}

答案 4 :(得分:0)

此类问题的常见解决方案是创建一个自定义对象,其属性与要返回的值一样多。 如果您无法为此创建新类,则可以使用Map<String, Object>,但此方法不是类型安全的。

答案 5 :(得分:0)

我认为Guava已经有了一个通用的Pair类,但我找不到它。如果您使用的是Java 1.5 +,则可以使用泛型构建自己的。

public class Pair<X,Y>
{
    public final X first;
    public final Y second;

    public Pair(X first, Y second) {
        this.first = first;
        this.second = second;
    }
}

随意将字段设为私有并添加getter。 :)使用它很容易:

return new Pair<Address,Team>(address, team);

<强>更新

Apache Commons LangPair。有关更多选项,请参阅this SO question