ArrayList是空的,但为什么呢?

时间:2011-03-18 23:31:00

标签: java enums arraylist

我正在尝试将卡添加到ArrayList卡座,但它似乎不起作用(大多数代码都是oracle.com上的示例)。我可能正在做一些非常愚蠢的事情,但我似乎无法找到它......这就是代码:

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

}

5 个答案:

答案 0 :(得分:4)

你的问题是你从未真正调用initDeck,因此套牌保持为空,就像静态初始化程序运行时一样:

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

其他问题:

  1. initDeck()是一种实例方法,但deck是静态引用。
  2. initDeck()是卡片上的一种方法。
  3. deckCard的静态成员,但是卡片不拥有或定义套牌。
  4. newDeck面对静态的最终套牌是荒谬的。
  5. 卡无论如何都不应该送甲板。
  6. 简而言之,你的设计搞砸了 - 你需要更多地思考实体及其相互关系。

答案 1 :(得分:1)

您的deck private static final和初始方法public以及non-static非常可疑。它可以初始化几次并包含更多你想要的卡片。您可能希望在静态块中进行初始化。

我会按如下方式替换代码:

  1. 制作套牌public static final并且不可修改(通过集合)
  2. 在静态初始值设定项中复制init方法的主体,如下所示:
  3. static {
      for (Suit suit : Suit.values()) {
        for (Rank rank : Rank.values()) {
          deck.add(new Card(rank, suit));
        }
      }
    }
    
    1. 完全删除initDeck

答案 2 :(得分:1)

很简单,在main方法中,您只需toString()ArrayList。您根本没有在initDeck()方法中调用main方法。

当您运行程序private static final List<Card> deck = new ArrayList<Card>(); 时,会为deck分配一个空的ArrayList

答案 3 :(得分:0)

这是因为initDeck()在任何地方都没有被调用。尝试将public void initDeck()替换为static

答案 4 :(得分:-2)

final定义中的关键字List<card>适用于具有无法更改的起始值的对象。

检查here