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

时间:2013-03-08 01:38:12

标签: java variables 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();

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

6 个答案:

答案 0 :(得分:11)

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

return new ValueHolder(gameStatus, rolls);

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

valueHolder.getGameStatus()

比这意味着什么。

intArray[0]

答案 1 :(得分:5)

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

你有一些选择:

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

  

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

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

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

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

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

答案 4 :(得分:3)

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

}

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

答案 5 :(得分:0)

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

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