java ArrayList为空,但为什么?
我试图将卡片添加到ArrayList deck中,但似乎不起作用(大部分代码都是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());
}
}
# 1 楼答案
您的问题是,您从未实际调用initDeck,因此deck仍然为空,就像静态初始值设定项运行时一样:
其他问题:
initDeck()
是一个实例方法,但deck
是一个静态引用李>initDeck()
是卡上的一种方法李>deck
是Card
的静态成员,但卡不拥有或定义卡组李>newDeck
在静态的最后一副牌面前是毫无意义的李>简而言之,您的设计是一团糟的-您需要越来越认真地思考实体及其相互关系
# 2 楼答案
在
List<card>
定义中的关键字final
用于具有无法更改的起始值的对象检查它here
# 3 楼答案
很简单,在
main
方法中,您只是toString()
一个空的ArrayList
。您根本没有在main
方法中调用initDeck()
方法当您运行程序
private static final List<Card> deck = new ArrayList<Card>();
时,为deck分配了一个空的ArrayList
# 4 楼答案
非常可疑的是,您的
deck
是private static final
,您的init方法是public
和non-static
。它可以初始化几次,并包含比您预期的更多的卡。您可能希望在静态块中进行初始化我会将守则改为:
public static final
不可修改(通过集合)initDeck
# 5 楼答案
这是因为
initDeck()
没有在任何地方被调用。尝试用static
替换public void initDeck()