是否可以从 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();
    

    例如使用Listarray

    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 中的方法返回多个值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

返回多个值的Java方法的最佳实践? [复制]

如何从 Python 中的函数返回多个值? [复制]

有没有一种方法可以从方法中返回多个整数? [复制]

如何在 C# 中的方法中返回多个值....有可能吗? [复制]

如何通过 JAVA 方法从 Firestore 返回数据而不是 0 值? [复制]

java 如何能在一个方法中返回多个值?