【问题标题】:Is it possible to return more than one value from a method in Java? [duplicate]是否可以从 Java 中的方法返回多个值? [复制]
【发布时间】: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(赢或输)。 有什么方法可以访问第二个返回值?还是有完全不同的方法?

【问题讨论】:

  • 使用对象数组或哈希图或模型类
  • 不,不是。您可以返回一个对象,并且该对象可以包含多个属性
  • @sissonb 所以我会返回一个数组并将索引 1 指定为 gameStatus 并将第二个索引指定为卷数?然后将其返回到现有数组?然后我可以在哪里访问它?
  • @OscarWilde 是的,但请记住数组的索引从 0 开始。您的方法也需要更改为 public static int[] crapsGame。这是一种返回值的快速而肮脏的方法。如果这将变成一个大型项目,那么最好返回一个像@rgettman 所说的对象,但需要创建类的开销并使用更多内存。

标签: java variables return


【解决方案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】:

      您可以通过以下方式做到这一点:

      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<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];
        
      3. 例如使用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");
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-14
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        • 2015-10-05
        • 2012-12-02
        • 2019-03-02
        • 2023-01-13
        相关资源
        最近更新 更多