CursedChico
CursedChico

Reputation: 581

Java enum, integer and string together define?

I want to define string and integer together but it gives errors.

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
}

The error is a syntax error on token 9, delete this token.

Upvotes: 14

Views: 41470

Answers (6)

s.d
s.d

Reputation: 29436

The things inside enums are identifiers, names of static final (constant) objects that'll be created. So, you can't use an int for naming an object.

enums allow you to place fields for each entry:

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

You really don't want to code all 52 cards this way. You can model it another way:

Suite:

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

Class with some popular ranks as named constants:

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

Upvotes: 9

Jazib
Jazib

Reputation: 1230

U cannot use integers inside enum like this. Please go through this: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Upvotes: 1

No Idea For Name
No Idea For Name

Reputation: 11577

try

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

instead of your enum

the problem is that if you could have put number as enum value then the compiler won't know, when someone write "9" it he meant the number or the enum. so java, as almost every language, won't allow this kind of enum value

Upvotes: 1

ug_
ug_

Reputation: 11440

Java naming rules say you cannot start variables, class names ect... with numbers.

Upvotes: 2

Tala
Tala

Reputation: 8928

In declaring enum in Java { Ace, 9, Queen, King } these are not strings and integers. These are actual objects of enum.

You can do this:

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

     private int rank;

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

     public int getRank() { 
         return rank;
     }
 }

Upvotes: 10

Duncan Jones
Duncan Jones

Reputation: 69339

You cannot start an enum field with a number. Try using NINE.

Upvotes: 4

Related Questions