10

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

当我写我的返回语句时,我只是试着把编译和运行正常的“&”放在里面;但我无法访问第二个返回值。

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(赢或输)。有什么方法可以访问第二个返回值?还是有完全不同的方法来解决它?

4

6 回答 6

12

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

return new ValueHolder(gameStatus, rolls);

可以返回具有多个值的数组,但这很神秘,而且对可读性没有任何帮助。更容易理解这意味着什么......

valueHolder.getGameStatus()

比这意味着什么。

intArray[0]
于 2013-03-08T01:39:48.940 回答
5

返回gameStatus & rolls的意思是“按位返回游戏状态和滚动”,这可能不是你想要的

你有一些选择:

  • 返回一个数组
  • 创建一个表示响应的类,每个值都有一个属性并返回一个实例
  • 使用许多 java 集合之一来返回值(可能是列表或映射)
于 2013-03-08T01:42:20.313 回答
3

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

于 2013-03-08T01:43:34.200 回答
3

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

不它不是。Java 只允许返回一个值。这个限制是硬连线到语言中的。

但是,有几种方法可以处理此限制:

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

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

于 2013-03-08T01:47:12.193 回答
3

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 示例,请告诉我)

于 2016-02-07T22:19:41.150 回答
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");
    
于 2016-02-07T22:01:54.110 回答