我正在使用模拟器来玩掷骰子,我试图从同一个方法中返回两个值(或者更确切地说,我想)。
当我写回复陈述时,我只是试着把"&"编译和运行正常;但我无法访问第二个返回值。
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(输赢)。 我能以任何方式访问第二个返回值吗?或者有一种完全不同的方式去做吗?
答案 0 :(得分:11)
创建自己的值持有者对象以保存两个值,然后返回它。
return new ValueHolder(gameStatus, rolls);
可以返回一个具有多个值的数组,但这是神秘的,并且它对可读性没有任何作用。理解这意味着什么更容易......
valueHolder.getGameStatus()
比这意味着什么。
intArray[0]
答案 1 :(得分:5)
返回gameStatus & rolls
表示“返回bitwise和gameStatus并滚动”,这可能不是你想要的
你有一些选择:
答案 2 :(得分:3)
您可以返回值数组或值集合。
答案 3 :(得分:3)
是否可以从Java中的方法返回多个值?
不,不是。 Java只允许返回一个值。这种限制与语言紧密相连。
但是,有一些方法可以解决这个限制:
Map
。这个(以及下一个)方法的问题在于你正在进入需要运行时类型检查的区域......这可能导致脆弱。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)
您可以按照以下方式执行此操作:
使用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();
使用List
或array
,例如
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");