是否可以从Java中的方法返回多个值?

我正在使用模拟器来玩掷骰子,我试图从同一个方法返回两个值(或者更确切地说,我想)。

当我写回复语句时,我只是尝试将“&”编译并正确运行; 但我无法访问第二个返回值。

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(); 

它被赋予与gamestatus相同的值… 0或1(输赢)。 我能以任何方式访问第二个返回值吗? 或者有一种完全不同的方式去做吗?

创建自己的值持有者对象以保存两个值,然后返回它。

 return new ValueHolder(gameStatus, rolls); 

可以返回一个具有多个值的数组,但这是神秘的,它对可读性没有任何作用。 理解这意味着什么更容易…

 valueHolder.getGameStatus() 

这意味着什么。

 intArray[0] 

返回gameStatus & rolls意味着“返回bitwise和gameStatus并滚动”,这可能不是你想要的

你有一些选择:

  • 返回一个数组
  • 创建一个类,该类使用每个值的属性表示响应并返回实例
  • 使用众多java集合中的一个来返回值(可能是列表或映射)

您可以返回值数组或值集合。

是否可以从Java中的方法返回多个值?

不它不是。 Java只允许返回一个值。 这种限制与语言紧密相连。

但是,有一些方法可以解决这个限制:

  • 编写一个轻量级的“holder”类,其中包含要返回的多个值的字段,并创建并返回该类的实例。
  • 返回包含值的Map 。 这种(以及下一种)方法的问题在于您正在进入需要运行时类型检查的区域……这可能导致脆弱性。
  • 返回包含值的数组。 数组必须具有适合所有值类型的基类型。
  • 如果这是对象的方法,则在同一对象和方法上添加一些字段,以允许调用者从上次调用中获取“辅助结果”。 (例如,JDBC ResultSet类执行此操作以允许客户端确定刚刚检索的值是否为NULL。)问题是这使得类在实例级别不可重入。
  • (你甚至可以在静态中返回额外的结果,但这是一个非常糟糕的主意。它使得所有实例中的类不可重入,更不用说与滥用静态相关的所有其他错误。)

其中,第一种选择是最干净的。 如果您担心创建持有者实例等的开销,您可以考虑重用实例; 例如,让调用者将现有的“holder”传递给应该放置结果的被调用方法。

OOP方法的最佳实践是返回一个Object。 包含所需值的对象。

例:

 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 + "\ty: " + y; } } 

如果您想要一种更具伸缩性的方法,那么您必须使用JSON响应。 (如果你想要一个带JSON的例子,请告诉我)

您可以按照以下方式执行此操作:

  1. 例如,使用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(); 
  2. 例如,使用Listarray

     public static List 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 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]; 
  3. 例如,使用Map

     public static Map crapsGame(String gameStatus, String rolls) { Map 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");