假设我在 java 中有一个方法,它在数据库中查找用户并返回他们的地址和他们所在的团队。
我想从方法中返回两个值,并且不想将方法一分为二,因为它涉及数据库调用,而拆分涉及调用次数的两倍。
考虑到中型到大型软件项目中的典型问题,最佳选择是什么?
whatGoesHere getUserInfo(String name) {
// query the DB
}
我知道这个问题与现有问题有重复的味道,但是每个其他问题都有一些元素使它与这个例子有足够的不同,我认为值得再问一次。
假设我在 java 中有一个方法,它在数据库中查找用户并返回他们的地址和他们所在的团队。
我想从方法中返回两个值,并且不想将方法一分为二,因为它涉及数据库调用,而拆分涉及调用次数的两倍。
考虑到中型到大型软件项目中的典型问题,最佳选择是什么?
whatGoesHere getUserInfo(String name) {
// query the DB
}
我知道这个问题与现有问题有重复的味道,但是每个其他问题都有一些元素使它与这个例子有足够的不同,我认为值得再问一次。
你有一些选择。最 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; }
};
}
}
无法地图帮助,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
首先对您的抽象、关系和多重性进行建模(参见下面的示例)。然后,您可以相应地对表进行建模。执行完这两个步骤后,您可以利用可配置为加载对象图的JPA,或者编写 JDBC 代码并通过使用适当的 SQL JOIN 运行 SQL 查询来自己创建图。
您可以返回一个字符串数组,其中包含用户名和组名。该方法如下所示:
public String[] getUserInfo(String name) {
String[] result = new String[2];
// query the DB
...
result[0] = userName;
result[1] = groupName;
return result;
}
此类问题的常见解决方案是创建一个自定义对象,该对象具有与您要返回的值一样多的属性。如果你不能为此创建一个新类,你可以使用 a Map<String, Object>
,但这种方法不是类型安全的。
我以为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。