2015-02-05 212 views
-2

在這個撲克遊戲代碼中,我試圖創建一個Card類。但是,我想使用enum類型,而不是使用constant,因爲我聽說它更好。唯一的問題是我嘗試了很多次,爲suitfaceValue分配實例值,它們是int變量到enum類型變量,但它表示不兼容的類型。怎麼了?如何將enum變量賦值給一個數值變量? Java

public class Card { 

    final static int MAX_SUITS = 4; 
    final static int MAX_FACE_VALUES = 13; 

    private int suit; 
    private int faceValue; 

    enum Suit {HEARTS, DIAMONDS, SPADES, CLUBS} 
    enum Face {ACE, JACK, QUEEN, KING} 

    public Card(int suit, int faceValue) { 
     this.suit = suit; 
     this.faceValue = faceValue; 
    } 

    public int getSuit() { 
     if (suit == 0) { 
      return suit = Suit.HEARTS; break; 
     else if (suit == 1) 
      return suit = Suit.DIAMONDS; break; 
     else if (suit == 2) 
      return suit = Suit.SPADES; break; 
     else if (suit == 3) 
      return suit = Suit.CLUBS; break; 
    } 

    public int getFaceValue() { 
     if (faceValue == 1) 
      return faceValue = Face.ACE; break; 
     else if (faceValue == 11) 
      return faceValue = Face.JACK; break; 
     else if (faceValue == 12) 
      return faceValue = Face.QUEEN; break; 
     else if (faceValue == 13) 
      return faceValue = Face.KING; break; 
    } 

    public void setFaceValue(int faceValue) { 
     this.faceValue = faceValue; 
    } 

    public void setSuit(int suit) { 
     this.suit = suit; 
    } 

    @Override 
    public String toString() { 
     if (suit > MAX_SUITS || faceValue > MAX_FACE_VALUES) 
      return "invalid entry"; 
     else if((suit < 0 || faceValue < 0)) 
      return "invalid entry"; 
     else 
      return faceValue + " of " + suit; 
    } 
} 
+6

你應該改變你的構造函數從公共卡(int suit,int faceValue){'到'公共卡(suit suit,face faceValue){'... – assylias 2015-02-05 16:21:54

+0

@assylias我說過,將它分配給一個數值變量而不改變它的類型!我希望下一次你能夠更好地閱讀這個問題,而不是比賽回答和評估。 – askd 2015-02-05 16:31:40

+3

@askd我看了你的問題。我的觀點是:你應該嘗試完全擺脫整體:使用枚舉的整個想法是,你不需要再使用int常量。如果您繼續使用整數,那麼您並沒有使用枚舉的全部功能。您可能需要在整數和枚舉之間進行轉換的唯一場景是,如果您從外部源接收整數,例如數據文件。在這種情況下,在枚舉和整數之間可以映射模式,例如通過向枚舉中添加一個int構造函數。 – assylias 2015-02-05 17:20:21

回答

3

如何枚舉變量分配給一個數值型變量?

你不行。您必須重構並將int(代表訴訟時)的所有用途更改爲Suit

2

我猶豫做寫這個答案,因爲它枚舉失敗的全部目的,也沒有意義創建任何形式的int值和enum常數之間的「映射」的。

只是不這樣做。

執行其他人的建議:將int值替換爲相應的enum常數。那麼你也將不再需要這些醜陋的解決方法與MAX_SUITS

一個(相對)乾淨實施Card類可以看成的如下:

public class Card { 

    public static void main(String[] args) 
    { 
     Card c0 = new Card(Suit.HEARTS, Face.ACE); 
     Card c1 = new Card(Suit.DIAMONDS, Face.QUEEN); 
     System.out.println(c0); 
     System.out.println(c1); 
    } 

    private final Suit suit; 
    private final Face face; 

    enum Suit {HEARTS, DIAMONDS, SPADES, CLUBS} 
    enum Face {ACE, JACK, QUEEN, KING} 

    public Card(Suit suit, Face face) { 
     this.suit = suit; 
     this.face = face; 
    } 

    public Suit getSuit() { 
     return suit; 
    } 

    public Face getFace() { 
     return face; 
    } 

    @Override 
    public String toString() { 
     return getFace() + " of " + getSuit(); 
    } 
} 

但是,仍然回答這個問題:可以使用內置方法在intenum值之間建立映射。您可以使用Enum#ordinal方法獲得int,並使用(隱式)Enum#values方法獲取可使用int作爲索引訪問的常量數組。

所以實施的不建議方式,它可能是這樣的:

public class Card { 

    public static void main(String[] args) 
    { 
     Card c0 = new Card(Suit.HEARTS.ordinal(), Face.ACE.ordinal()); 
     Card c1 = new Card(Suit.DIAMONDS.ordinal(), Face.QUEEN.ordinal()); 
     System.out.println(c0); 
     System.out.println(c1); 
    } 

    final static int MAX_SUITS = 4; 
    final static int MAX_FACE_VALUES = 13; 

    private int suit; 
    private int faceValue; 

    enum Suit {HEARTS, DIAMONDS, SPADES, CLUBS} 
    enum Face {ACE, JACK, QUEEN, KING} 

    public Card(int suit, int faceValue) { 
     this.suit = suit; 
     this.faceValue = faceValue; 
    } 

    public int getSuit() { 
     return suit; 
    } 

    public int getFaceValue() { 
     return faceValue; 
    } 

    public Suit getSuitEnum() { 
     return Suit.values()[suit]; 
    } 

    public Face getFaceValueEnum() { 
     return Face.values()[faceValue]; 
    } 

    public void setFaceValue(int faceValue) { 
     this.faceValue = faceValue; 
    } 

    public void setSuit(int suit) { 
     this.suit = suit; 
    } 

    @Override 
    public String toString() { 
     if (suit > MAX_SUITS || faceValue > MAX_FACE_VALUES) 
      return "invalid entry"; 
     else if((suit < 0 || faceValue < 0)) 
      return "invalid entry"; 
     else 
      return getFaceValueEnum() + " of " + getSuitEnum(); 
    } 
} 

編輯:我想的混亂來自於你想存放「面值」作爲一個枚舉的事實並且僅有的一些的面值的enum常量(而其他值僅爲int,從2到10)。要這樣說的話:存儲面值爲枚舉可能不是一個好主意......

0

另一種不推薦的方法做你想要什麼: (我剛剛寫了這個代碼的ad-hoc並沒有運行它,所以任何錯字的道歉):

public enum Suit { 

    HEARTS(1), 
    DIAMONDS(2), 
    SPADES(3), 
    CLUBS(4); 

    private int id = -1; 

    public Suit(int id) { 
    this.id = id; 
    } 

    public int getId() { 
    return id; 
    } 

    public static Suit parse(int suitId) { 
    for(Suit s : values()) { 
     if(s.getId() == suitId) { 
     return s; 
     } 
    } 
    return null; 
    } 
} 



public enum Face { 

    ACE(11), 
    JACK(12), 
    QUEEN(13), 
    KING(14); 

    private int val = -1; 

    public Face(int val) { 
    this.val = val; 
    } 

    public int getVal() { 
    return val; 
    } 

    public static Face parse(int faceVal) { 
    for(Face f : values()) { 
     if(f.getVal() == faceVal) { 
     return f; 
     } 
    } 
    return null; 
    } 
} 


public class Card { 

    final static int MAX_SUITS = 4; 
    final static int MAX_FACE_VALUES = 13; 

    private Suit suit; 
    private Face faceValue; 

    public Card(int suit, int faceValue) { 
     setSuit(suit); 
     setFaceValue(faceValue); 
    } 

    public int getSuit() { 
     return suit.getId(); 
    } 

    public int getFaceValue() { 
     return face.getVal(); 
    } 

    public void setFaceValue(int faceValue) { 
     this.faceValue = Face.parse(faceValue); 
    } 

    public void setSuit(int suit) { 
     this.suit = Suit.parse(suit); 
    } 

    ... 
} 

但你基本上使用enum作爲整數存儲在這種情況下。卡上的外部參與者基本上只與整數有關,所以使用枚舉純粹是內部的,在這裏是沒有意義的。

你的getSuit()getFaceValue()初步實現另一點 - 我想你大概意思是在利用一個開關(break的不具備那些if/else產生巨大影響的):

Suit returnVal; 

switch(suit) { 
    case 0: returnVal = Suit.HEARTS; 
      break; 
    case 1: returnVal = Suit.DIAMONDS; 
      break; 
    case 2: returnVal = Suit.SPADES; 
      break; 
    case 3: returnVal = Suit.CLUBS; 
      break; 
    default: returnVal = null; 
      break; 
} 

return returnVal;