2011-03-18 74 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