3

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

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

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

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

我知道这个问题与现有问题有重复的味道,但是每个其他问题都有一些元素使它与这个例子有足够的不同,我认为值得再问一次。

4

6 回答 6

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; }
    };
  }
}
于 2012-07-04T03:28:17.667 回答
0

无法地图帮助,MultivalueMap。其中键是用户名,两个值是地址和团队名称。我假设您的地址和团队都是字符串变量,您可以在此处了解有关多值映射的更多信息

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

于 2012-07-04T03:27:47.673 回答
0

首先对您的抽象、关系和多重性进行建模(参见下面的示例)。然后,您可以相应地对表进行建模。执行完这两个步骤后,您可以利用可配置为加载对象图的JPA,或者编写 JDBC 代码并通过使用适当的 SQL JOIN 运行 SQL 查询来自己创建图。

  • 用户有一个地址
  • 一个团队可以有 1 个或多个用户(一个用户可以为更多团队效力吗?)
于 2012-07-04T03:34:40.920 回答
0

您可以返回一个字符串数组,其中包含用户名和组名。该方法如下所示:

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

    return result;
}
于 2012-07-04T03:38:56.770 回答
0

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

于 2012-07-04T14:14:18.963 回答
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 Lang拥有Pair. 有关更多选项,请参阅此 SO question

于 2012-07-05T00:06:11.210 回答