10

私はシミュレーターを使ってクラップスをプレイしていて、同じメソッドから2つの値を返そうとしています(というよりもやりたいです)。

returnステートメントを書いたとき、コンパイルして正しく実行される「&」を入れてみました。しかし、2番目の戻り値にアクセスする方法がありません。

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(勝ち負け)。2番目の戻り値にアクセスする方法はありますか?それとも、それについて完全に異なる方法がありますか?

4

6 に答える 6

12

両方の値を保持する独自の値ホルダーオブジェクトを作成し、それを返します。

return new ValueHolder(gameStatus, rolls);

複数の値を持つ配列を返すことは可能ですが、それは不可解であり、読みやすさのためには何もしません。これが何を意味するのかを理解するのははるかに簡単です...

valueHolder.getGameStatus()

これが意味するよりも。

intArray[0]
于 2013-03-08T01:39:48.940 に答える
5

返すgameStatus & rollsとは、「ビット単位で、gameStatusとrollsを返す」ことを意味しますが、これはおそらくあなたが望むものではありません

ここにいくつかのオプションがあります:

  • 配列を返す
  • 各値のプロパティを使用して応答を表すクラスを作成し、インスタンスを返します
  • 多くのJavaコレクションの1つを使用して、値(おそらくリストまたはマップ)を返します。
于 2013-03-08T01:42:20.313 に答える
3

値の配列または値のコレクションを返すことができます。

于 2013-03-08T01:43:34.200 に答える
3

Javaのメソッドから複数の値を返すことは可能ですか?

いいえそうではありません。Javaでは、1つの値のみを返すことができます。この制限は言語に組み込まれています。

ただし、この制限に対処するためのいくつかのアプローチがあります。

  • 返したい複数の値のフィールドを持つ軽量の「ホルダー」クラスを作成し、そのクラスのインスタンスを作成して返します。
  • 値を含むを返しMapます。この(そして次の)アプローチの問題は、ランタイム型チェックを必要とする領域に迷い込んでいることです...そしてそれは脆弱性につながる可能性があります。
  • 値を含む配列を返します。配列には、すべての値の型に対応する基本型が必要です。
  • これがオブジェクトのメソッドである場合は、同じオブジェクトとメソッドにいくつかのフィールドを追加して、呼び出し元が最後の呼び出しから「補助結果」を取得できるようにします。(たとえば、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. たとえば、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];
    
  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 に答える