2013-08-15 5 views
7

Voglio definire stringa e numero intero insieme ma dà errori.L'enumerazione Java, l'intero e la stringa insieme definiscono?

public class Card { 
    Rank rank; 
    Suit suit; 
    public Card(Rank rank, Suit suit){ 
     this.rank=rank; 
     this.suit=suit; 
    } 
    public enum Rank { Ace, 9, Queen, King } //and other suits 
} 

L'errore è un errore di sintassi sul token 9, eliminare questo token.

+0

non credo che si può mettere intero come un valore di enumerazione –

+0

A intero non è un nome di variabile valido in Java! –

risposta

3

Non è possibile avviare un campo enum con un numero. Prova a utilizzare NINE.

8

Nel dichiarare enum in Java { Ace, 9, Queen, King } questi non sono stringhe e interi. Questi sono oggetti reali di enum.

Si può fare questo:

public enum Rank { 
    Ace(13), 
    Nine(8), 
    //etc 
    ; 

    private int rank; 

    Rank(int rank) { 
     this.rank = rank; 
    } 

    public int getRank() { 
     return rank; 
    } 
} 
+0

'enum Rank {Ace, 9, Queen, King};' dà un errore come questo 'Errore di sintassi sul token" 9 ", Identificatore previsto' .... non riesco a capire perché? –

+0

@AnudeepSamaiya Perché 9 non è un nome di variabile valido. Non è possibile assegnare un nome alle variabili 9, le costanti enum agiscono anche come variabili. Possono persino essere, in effetti, variabili. – Haggra

2

Java regole di denominazione dicono che non è possibile avviare le variabili, i nomi delle classi ect ... con i numeri.

1

provare

public enum Rank { Ace, Jack, Queen, King }//and other suits 

al posto del tuo enum

il problema è che se si potrebbe avere messo numero come valore enum poi il compilatore non si sa, quando qualcuno scrivere "9" si intendesse il numero o l'enum. così java, come quasi tutte le lingue, non permetterà questo tipo di valore enum

+0

@DuncanJones copia incolla dal codice che ha funzionato che è andato storto. risolto e aggiunto informazioni –

+0

@DuncanJones, lo so. grazie, cerco sempre di lasciare almeno una buona risposta di lavoro –

6

Le cose all'interno enum s sono identificatori, nomi di statica finale (costante) oggetti che sarà creato. Quindi, non puoi usare un int per nominare un oggetto.

enum s consentono di posizionare i campi per ogni voce:

public static enum Suit {HEART,DIAMOND,SPADE,CLUB} 

public static enum Cards { 
    ACE_OF_HEART(Suit.HEART,14), QUEEN_OF_SPADE(Suit.SPADE,13) /* etc etc*/; 

    private final Suit mSuit; 
    private final int mRank; 

    private Cards(Suit suit, int rank) { 
     assert rank >= 2 && rank <= 14; 
     mSuit = suit; 
     mRank = rank; 
    } 

    public Suit getSuit() { 
     return mSuit; 
    } 

    public int getRank() { 
     return mRank; 
    } 
} 

Davvero non si vuole codificare tutte le 52 carte in questo modo. È possibile modellare in un altro modo:

Suite:

public static enum Suit { SPADE, HEART, DIAMOND, CLUB}; 

Class con alcuni ranghi popolari come costanti denominate:

public class Card{ 

    public static final int ACE = 14; 
    public static final int QUEEN = 13; 
    public static final int KING = 12; 
    public static final int JACK = 11; 

    private final int mRank; 
    private final Suite mSuit; 

    public Card(Suite s, int r){ 
    this.mSuit = s; 

    if(r < 2 || r > 14){ 
     throw new IllegalArgumentException("No such card with rank: "+r); 
    }  

    this.mRank = r; 
    } 

    public Suit getSuit() { 
     return mSuit; 
    } 

    public int getRank() { 
     return mRank; 
    } 
}