2011-03-18 79 views
1

我正在嘗試將卡添加到ArrayList卡組,但它似乎不起作用(大部分代碼都是oracle.com上的示例)。我可能做一些非常愚蠢的,但我似乎無法找到它..這是代碼:ArrayList是空的,但爲什麼?

public class Card { 

    public enum Rank 
    { 
     DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, 
     TEN, JACK, QUEEN, KING, ACE 
    } 

    public enum Suit 
    { 
     HEARTS, DIAMONDS, SPADES, CLUBS 
    } 

    private final Rank rank; 
    private final Suit suit; 
    private static final List<Card> deck = new ArrayList<Card>(); 

    public Card(Rank rank, Suit suit) 
    { 
     this.suit = suit; 
     this.rank = rank; 
    } 
    // initializes deck 
    public void initDeck() 
    { 
     for (Suit suit : Suit.values()) 
     { 
      for (Rank rank : Rank.values()) 
      { 
       deck.add(new Card(rank, suit)); 
      } 
     } 
    } 
    // returns a copy of the deck  
    public static ArrayList<Card> newDeck() 
    { 
     return new ArrayList<Card>(deck); 
    } 

    public Rank getRank() 
    { 
     return rank; 
    } 

    public Suit getSuit() 
    { 
     return suit; 
    } 

    public String toString() 
    { 
     return rank +" of "+ suit; 
    } 

    public static void main(String[] args) 
    { 
     System.out.println(deck.toString()); 
    } 

} 
+3

明顯的檢查......你在哪裏調用'initDeck'? – MarkPowell 2011-03-18 23:33:11

+0

大聲笑我沒有打電話給initDeck哈哈謝謝。 – Loolooii 2011-03-18 23:37:14

+1

好,太糟糕了,我的評論不是一個答案!哈! – MarkPowell 2011-03-18 23:37:52

回答

4

你的問題是,你永遠不會真正調用initDeck,所以在甲板上保持爲空,因爲它當時正值靜態初始化跑:

private static final List<Card> deck = new ArrayList<Card>(); 

其他問題:

  1. initDeck()是一個實例方法,但deck是一個靜態的參考。
  2. initDeck()是Card上的一種方法。
  3. deckCard的靜態成員,但卡片沒有擁有或定義卡組。
  4. newDeck面對靜態的最終卡組是無意義的。
  5. 卡不應該提供套牌。

簡而言之,你的設計被搞砸了 - 你需要對實體及其相互關係進行更多更多的思考。

+0

+1 - 這裏真正的問題是設計是一個概念上的混亂。 – 2011-03-18 23:47:35

+0

所以我應該做一個甲板課?並在那裏進行初始化? – Loolooii 2011-03-18 23:53:07

0

這是因爲initDeck()沒有被調用任何地方。嘗試用static代替public void initDeck()

+0

看起來像Downvoter先生不知道Java,嘿嘿。 – hoha 2011-03-18 23:46:57

1

非常可疑您的deckprivate static final和您的初始方法publicnon-static。它可以被初始化幾次,幷包含更多的卡片,然後你會期望。您可能想要在靜態塊中進行初始化。

我會如下替換代碼:

  1. 使甲板public static final和不可修改的(通過集合)
  2. 複製你的init方法的身體在靜態初始化是這樣的:
static { 
    for (Suit suit : Suit.values()) { 
    for (Rank rank : Rank.values()) { 
     deck.add(new Card(rank, suit)); 
    } 
    } 
} 
  1. 刪除initDeck完全
-2

在你的關鍵字finalList<card>定義爲對象,將有一個不能改變的初始值。

檢查它here

+0

final不會阻止添加/刪除元素,只會重新分配引用。 – MarkPowell 2011-03-18 23:41:47

+0

不,它只是意味着您不能重新分配參考 - 您當然可以對其引用的對象進行更改。 – 2011-03-18 23:42:13

1

很簡單,在你main方法,你只是toString()ArrayList。您根本沒有在main方法中調用initDeck()方法。

當您運行程序private static final List<Card> deck = new ArrayList<Card>(); 時,卡組被分配了一個空的ArrayList