是否可以从 Java 中的方法返回多个值? [复制]
Posted
技术标签:
【中文标题】是否可以从 Java 中的方法返回多个值? [复制]【英文标题】:Is it possible to return more than one value from a method in Java? [duplicate] 【发布时间】:2013-02-23 11:34:45 【问题描述】:我正在使用模拟器玩掷骰子,我试图从同一个方法返回两个值(或者更确切地说,我愿意)。
当我写我的return语句时,我只是试着把编译和运行正常的“&”放进去;但我无法访问第二个返回值。
public static int crapsGame()
int myPoint;
int gameStatus = rollagain;
int d1,d2;
int rolls=1;
d1 = rollDice();
d2 = rollDice();
switch ( d1+d2 )
case 7:
case 11:
gameStatus = win;
break;
case 2:
case 3:
case 12:
gameStatus = loss;
break;
default:
myPoint = d1+d2;
do
d1=rollDice();
d2=rollDice();
rolls++;
if ( d1+d2 == myPoint )
gameStatus = win;
else if ( d1+d2 == 7 )
gameStatus = loss;
while (gameStatus == rollagain);
// end of switch
return gameStatus & rolls;
当我将值返回为:
gameStatus=crapsGame();
它适当地将变量设置为赢或输,但如果我尝试像以下语句一样简单的事情:
rolls=crapsGame();
它被赋予与游戏状态相同的值...一个 0 或一个 1(赢或输)。 有什么方法可以访问第二个返回值?还是有完全不同的方法?
【问题讨论】:
使用对象数组或哈希图或模型类 不,不是。您可以返回一个对象,并且该对象可以包含多个属性 你应该返回一个 int[]。结帐docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html @sissonb 所以我会返回一个数组并将索引 1 指定为 gameStatus 并将第二个索引指定为卷数?然后将其返回到现有数组?然后我可以在哪里访问它? @OscarWilde 是的,但请记住数组的索引从 0 开始。您的方法也需要更改为public static int[] crapsGame
。这是一种返回值的快速而肮脏的方法。如果这将变成一个大型项目,那么最好返回一个像@rgettman 所说的对象,但需要创建类的开销并使用更多内存。
【参考方案1】:
创建您自己的值持有者对象来保存这两个值,然后返回它。
return new ValueHolder(gameStatus, rolls);
可以返回一个包含多个值的数组,但这很神秘,而且对可读性没有任何帮助。更容易理解这意味着什么......
valueHolder.getGameStatus()
比这意味着什么。
intArray[0]
【讨论】:
我还会返回什么值持有者?如声明: gameStatus=crapsGame();什么将持有价值持有者的价值;如果那有意义的话?抱歉,这听起来很荒谬……我对 ValueHolder 完全不熟悉 ValueHolder 是您将创建的一个类——一个自定义对象。然后你会写类似ValueHolder valueHolder = crapsGame();
谢谢!我选择了数组方法,因为它稍微简单一些(因为我只需要两个值),但我很欣赏这种方法的回复和优点!另外,我学到了一些额外的东西,这总是很好的;因为我从未听说过“ValueHolder”!【参考方案2】:
返回 gameStatus & rolls
表示“返回按位和 gameStatus 和 rolls”,这可能不是你想要的
你有一些选择:
返回一个数组 创建一个表示响应的类,每个值都有一个属性并返回一个实例 使用众多 java 集合之一来返回值(可能是列表或映射)【讨论】:
我确实最终使用了数组方法,但我想知道您是否可以扩展一点“按位返回游戏状态和滚动”当我输入它时我实际上返回的是什么那个? @OscarWilde 确定:按位和运算符 & 将在其两个操作数上一次应用逻辑与一位(查看:docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)【参考方案3】:您可以返回值的数组或值的集合。
【讨论】:
【参考方案4】:是否可以从 Java 中的方法返回多个值?
不,不是。 Java 只允许返回一个值。这个限制是固定在语言中的。
但是,有几种方法可以处理此限制:
编写一个轻量级的“持有人”类,其中包含要返回的多个值的字段,然后创建并返回该类的一个实例。 返回包含值的Map
。这种(以及下一种)方法的问题在于,您误入了一个需要运行时类型检查的领域……这可能导致脆弱性。
返回一个包含值的数组。数组必须有一个可以容纳所有值的类型的基本类型。
如果这是对象上的方法,则在同一对象上添加一些字段和方法,以允许调用者从上次调用中获取“辅助结果”。 (例如,JDBC ResultSet
类这样做是为了允许客户端确定刚刚检索到的值是否为 NULL。)问题是这使得类在实例级别不可重入。
(您甚至可以在静态数据中返回额外的结果,但这是一个非常糟糕的主意。它使类在所有实例中不可重入,更不用说与滥用静态数据相关的所有其他坏处了。)
其中,第一个选项是最干净的。如果您担心创建持有者实例等的开销,您可以考虑重用这些实例;例如让调用者将现有的“持有者”传递给被调用的方法,结果应该放入其中。
【讨论】:
【参考方案5】:OOP 方法的最佳实践是返回一个对象。一个包含所有你想要的值的对象。
例子:
class Main
public static void main(String[] args)
MyResponse response = requestResponse();
System.out.println( response.toString() );
private static MyResponse requestResponse()
return new MyResponse( "this is first arg", "this is second arg" );
class MyResponse
private String x, y;
public MyResponse( String x, String y )
this.x = x;
this.y = y;
@Override
public String toString()
return "x: " + x + "\t y: " + y;
如果您想要一种更具可扩展性的方法,那么您必须使用 JSON 响应。 (如果您也想要 JSON 示例,请告诉我)
【讨论】:
这个问题是3年前的问题了……为什么今晚突然得到两个新答案? 刚刚显示到“最新”部分的人。不知道。【参考方案6】:您可以通过以下方式做到这一点:
使用一个Container类,例如
public class GameStatusAndRolls
String gameStatus;
String rolls;
... // constructor and getter/setter
public static GameStatusAndRolls crapsGame(String gameStatus, String rolls)
return new GameStatusAndRolls(gameStatus, rolls);
public static void main(String[] args)
...
GameStatusAndRolls gameStatusAndRolls = crapsGame(gameStatus, rolls);
gameStatusAndRolls.getGameStatus();
例如使用List
或array
public static List<Integer> crapsGame(String gameStatus, String rolls)
return Arrays.asList(gameStatus, rolls);
private static final int GAME_STATUS = 0;
private static final int ROOLS = 0;
public static void main(String[] args)
...
List<Integer> list = crapsGame(gameStatus, rolls);
... list.get(0)...list.get(GAME_STATUS);
... list.get(1)...list.get(ROOLS);
或
public static String[] crapsGame(String gameStatus, String rolls)
return new String[] gameStatus, rolls;
private static final int GAME_STATUS = 0;
private static final int ROOLS = 0;
public static void main(String[] args)
...
String[] array = crapsGame(gameStatus, rolls);
... array[0]...array[GAME_STATUS];
... array[1]...array[ROOLS];
例如使用Map
public static Map<String, String> crapsGame(String gameStatus, String rolls)
Map<String, String> result = new HashMap<>(2);
result.put("gameStatus", gameStatus);
result.put("rolls", rolls);
return result;
public static void main(String[] args)
...
Map map = crapsGame(gameStatus, rolls);
... map.get("gameStatus")...map.get("rolls");
【讨论】:
以上是关于是否可以从 Java 中的方法返回多个值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中的方法中返回多个值....有可能吗? [复制]