我正在尝试将卡添加到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());
}
}
答案 0 :(得分:4)
你的问题是你从未真正调用initDeck,因此套牌保持为空,就像静态初始化程序运行时一样:
private static final List<Card> deck = new ArrayList<Card>();
其他问题:
initDeck()
是一种实例方法,但deck
是静态引用。initDeck()
是卡片上的一种方法。deck
是Card
的静态成员,但是卡片不拥有或定义套牌。newDeck
面对静态的最终套牌是荒谬的。简而言之,你的设计搞砸了 - 你需要更多地思考实体及其相互关系。
答案 1 :(得分:1)
您的deck
private static final
和初始方法public
以及non-static
非常可疑。它可以初始化几次并包含更多你想要的卡片。您可能希望在静态块中进行初始化。
我会按如下方式替换代码:
public static final
并且不可修改(通过集合)static { for (Suit suit : Suit.values()) { for (Rank rank : Rank.values()) { deck.add(new Card(rank, suit)); } } }
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