2013-03-08 15 views
6

Sto usando un simulatore per giocare a craps e sto cercando di restituire due valori con lo stesso metodo (o meglio mi piacerebbe farlo).È possibile restituire più di un valore da un metodo in Java?

Quando ho scritto la mia dichiarazione di ritorno, ho semplicemente provato a inserire "&" che ha compilato e funziona correttamente; ma non ho modo di accedere al secondo valore restituito.

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; 
} 

Quando torno il valore come:

gameStatus=crapsGame(); 

Esso definisce in modo appropriato il varaible di vincere o perdere, ma se provo qualcosa di semplice come successivo dichiarazione con:

rolls=crapsGame(); 

Viene assegnato lo stesso valore del gamestatus ... uno 0 o un 1 (vittoria o sconfitta). Qualsiasi modo per accedere al secondo valore restituito? O c'è un modo completamente diverso per farlo?

+0

usa array di oggetti o hashmap o classe modello –

+5

No, non lo è. Puoi restituire un oggetto e quell'oggetto può contenere più proprietà –

+0

Dovresti restituire un int []. Checkout http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html – sissonb

risposta

9

Creare il proprio oggetto titolare valore per contenere entrambi i valori, quindi restituirlo.

return new ValueHolder(gameStatus, rolls); 

È possibile restituire un array con più valori, ma è criptico e non fa nulla per la leggibilità. È molto più facile capire cosa significa ...

valueHolder.getGameStatus() 

di ciò che significa.

intArray[0] 
+0

Cosa restituirei anche un valore? Come nella dichiarazione: gameStatus = crapsGame(); cosa avrebbe il valore di un detentore di valore; se questo ha senso? Scusa se questo suona ridicolmente idiota ... Sono completamente sconosciuto con ValueHolder – OscarWilde

+0

ValueHolder è una classe che verrà creata, un oggetto personalizzato. Quindi scriverai qualcosa come: ValueHolder valueHolder = crapsGame(); ' – rgettman

+0

grazie! Sono andato con il metodo array perché era leggermente più semplice (visto che ho solo bisogno di due valori) ma apprezzo la risposta e il merito di questo metodo! Inoltre, ho imparato qualcosa in più che è sempre bello; perché non avevo mai sentito parlare di "ValueHolder"! – OscarWilde

5

ritorno gameStatus & rolls significa "restituire il bit a bit e di gameStatus e panini" che probabilmente non è ciò che si vuole

avete alcune opzioni qui:

  • restituire un array
  • creare una classe che rappresenta la risposta con una proprietà per ogni valore e restituisce un'istanza
  • utilizza una delle molte raccolte java da ri ruotare i valori (probabilmente elenchi o mappe)
+0

Alla fine ho optato per il metodo array ma mi stavo chiedendo se potessi espandere un po 'il "return the bitwise e di gameStatus and roll" Cosa stavo effettivamente tornando quando l'ho inserito in quel modo? – OscarWilde

+0

@OscarWilde sicuro: l'operatore di bit e l'operatore applicheranno una logica AND un bit alla volta sui suoi due operandi (controlla questo: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html) –

3

È possibile restituire una matrice di valori o una Raccolta di valori.

3

È possibile restituire più di un valore da un metodo in Java?

No, non lo è. Java consente di restituire un solo valore. Questa restrizione è cablata nella lingua.

Tuttavia, ci sono alcuni approcci per affrontare questa restrizione:

  • scrivere una classe leggera "porta" con campi per i molteplici valori che si desidera tornare, e creare e restituire un'istanza di quella classe.
  • Restituisce un Map contenente i valori. Il problema con questo (e il prossimo) approccio è che ti stai allontanando in un'area che richiede il controllo del tipo di runtime ...e ciò può portare alla fragilità.
  • Restituisce una matrice contenente i valori. L'array deve avere un tipo di base che possa contenere i tipi di tutti i valori.
  • Se questo è un metodo su un oggetto, quindi aggiungere alcuni campi sullo stesso oggetto e metodi che consentono al chiamante di raccogliere "risultati ausiliari" dall'ultima chiamata. (Ad esempio, la classe JDBC ResultSet esegue questa operazione per consentire a un client di determinare se il valore appena recuperato era un valore NULL.) Il problema è che ciò rende la classe non rientranti a livello di istanza.
  • (Si potrebbe anche ritorni risultati supplementari in statica, ma è una pessima idea. Rende la classe non rientrante in tutte le istanze, per non parlare di tutte le altre badnesses associati statica abusati.)

Di questi, la prima opzione è la più pulita. Se sei preoccupato per il sovraccarico di creazione di istanze di titolari, ecc., Potresti prendere in considerazione il riutilizzo delle istanze; per esempio. fare in modo che il chiamante passi un "titolare" esistente al metodo chiamato in cui devono essere posizionati i risultati.

0

Puoi seguente modi per farlo:

  1. utilizzare una classe contenitore, per esempio

    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. Usa List o un array, ad esempio

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

    o

    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. Usa Map, ad esempio

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

La pratica migliore per un approccio OOP è quello di restituire un oggetto. Un oggetto che contiene tutti i valori che vuoi.

Esempio:

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; 
    } 

} 

Se si desidera un approccio ancora più scalabile allora è necessario utilizzare le risposte JSON. (fammi sapere se vuoi un esempio anche con JSON)

+0

Questa domanda è di 3 anni fa ... perché ho ricevuto improvvisamente due nuove risposte stasera? – OscarWilde

+0

Appena visualizzato nella sezione "più recente" man. Non lo so – NikosKeyz

Problemi correlati