从java方法返回两个值
假设我有一个java方法,它在数据库中查找用户并返回他们的地址和所在团队 我想从该方法返回两个值,不想将该方法一分为二,因为它涉及一个数据库调用,而拆分涉及两倍的调用数 考虑到中大型软件项目中的典型问题,最好的选择是什么从java方法返回两个值,java,oop,coding-style,Java,Oop,Coding Style,假设我有一个java方法,它在数据库中查找用户并返回他们的地址和所在团队 我想从该方法返回两个值,不想将该方法一分为二,因为它涉及一个数据库调用,而拆分涉及两倍的调用数 考虑到中大型软件项目中的典型问题,最好的选择是什么 whatGoesHere getUserInfo(String name) { // query the DB } 我知道这个问题与现有的问题有重复的味道,但是每个问题都有一些元素,使得它与这个例子有很大的不同,我认为值得再问一次。地图帮助不了,多值地图。其中键是用户名,
whatGoesHere getUserInfo(String name) {
// query the DB
}
我知道这个问题与现有的问题有重复的味道,但是每个问题都有一些元素,使得它与这个例子有很大的不同,我认为值得再问一次。地图帮助不了,多值地图。其中键是用户名,2个值是地址和团队名称。我假设您的地址和团队都是字符串变量,您可以在这里了解有关多值映射的更多信息 您有一些选择。 最糟糕的是创建一个类来封装这两个属性,类似这样
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; }
};
}
}
首先对你的抽象、关系和多样性进行良好的建模(参见下面的示例)。然后可以相应地对表进行建模。执行这两个步骤后,您可以利用可以配置为加载对象图的工具,也可以编写JDBC代码,并通过使用适当的SQL联接运行SQL查询来自行创建图
- 用户有一个地址
- 一个团队可以有一个或多个用户(一个用户可以为更多的团队踢球吗?)
public String[] getUserInfo(String name) {
String[] result = new String[2];
// query the DB
...
result[0] = userName;
result[1] = groupName;
return result;
}
这类问题的一个常见解决方案是创建一个自定义对象,该对象的属性与要返回的值的数量相同。 如果不能为此创建新类,可以使用
映射
,但这种方法不是类型安全的。我以为已经有了泛型类,但我找不到它。如果您使用的是Java1.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;
}
}
公共类对
{
公开决赛X第一;
公开决赛第二名;
公共对(X第一,Y第二){
this.first=first;
这个秒=秒;
}
}
请随意将字段设置为私有并添加getter.:)使用它很容易:
return new Pair<Address,Team>(address, team);
返回新的对。有关更多选项,请参阅。一些建议。。。自己创建一个结构/在参数中使用诸如键值对/传递指针之类的东西我不想为此目的创建一个类,因为它会产生额外的噪音。此外,用户的团队和名称没有“逻辑绑定”-我是否应该创建一个不同的类来表示我可能希望从查询中返回的每个值组合?如果调用方知道返回的内容,您可以将其放在一个映射中,其中键为Address和team。这在很大程度上取决于调用方是否知道要查找哪些键。因此,您有两个选项,即我向您展示的第二个解决方案(数组解决方案),或者像@Thomas建议的那样,返回HashMap会有点奇怪。我认为API方法的getUserInfo
应该返回UserInfo
而不是Object[]
。我也是。不要返回数组。这是一个混乱的解决方案。使用“UserInfo”类。您甚至可以在以后添加值,而无需更改所有内容。正如托马斯已经说过的。。。打电话的人知道会发生什么。所以一个UserInfo类是可以的。我如何辨别哪个是用户名,哪个是地址?@BeeOnRope:你可以只使用普通的映射。可以将字符串映射到对象。这比Object[]
更简单,但仍然不如创建类那么简单。第一个值始终是键。。这是您的用户名,这些值是地址和团队名称。您的映射看起来像,Address1,Team1>然后您可以轻松地对这些值进行迭代,并获得地址和团队名称。在java 8中,我们在javafx.util包中构建了Pair类。