假设我在java中有一个方法,它在数据库中查找用户并返回他们的地址和他们所在的团队。
我想从方法中返回两个值,并且不希望将方法拆分为两个,因为它涉及数据库调用,并且拆分涉及调用次数的两倍。
考虑到中到大型软件项目的典型问题,最佳选择是什么?
whatGoesHere getUserInfo(String name) {
// query the DB
}
我知道这个问题与现有的问题有些重复,但是每个问题都有一些因素使得它与这个例子不同,我觉得值得再次提问。
答案 0 :(得分:9)
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 Lang有Pair
。有关更多选项,请参阅this SO question。