![](/img/trans.png)
[英]How do I modify the text of a JTextfield from a different class? (Java)
[英]How do I modify an arraylist from a different class? Java
我正在写一个扑克游戏,并将所有卡存储在Deck类中创建的arraylist中:
public class Deck {
ArrayList<Card> deck = new ArrayList<Card>();
Deck(){ //Build the deck in order.
for(int suit = 1; suit <= 4; suit++){
for(int rank = 1; rank <= 13; rank++){
Card card = new Card(rank, suit);
deck.add(card);
}
}
}
。 。 。
我想要另一个类 - 手工绘制arraylist中的前五个元素并将它们放入一个名为myHand的新arraylist中:
public class Hand {
ArrayList<Card> myHand = new ArrayList<Card>();
Deck deckObject = new Deck();
public void Draw(){ //Draws the top 5 cards of the deck and puts them in your hand ArrayList.
for(int i = 0; i <= 4; i++){
myHand.add(deckObject.deck.get(0));
deckObject.deck.remove(0);
}
}
。 。 。 到现在为止还挺好。 当我从主类中显示手ArrayList时,我得到了牌组中的前五张牌。 但是,当我从Deck类显示牌组时(在调用Draw()方法之后),所有52张牌仍在那里。
如果我在Hand类中创建一个getDeck()方法并调用它,前五张卡将按预期删除...
所以我似乎在这两个类之间进行单向通信; 当我从Hand类修改ArrayList时,Deck类不知道它,并且似乎每个类都保留了ArrayList的单独版本。 这里发生了什么?
每只Hand
都有自己的Deck
。 你想在很多人手中分享一个Deck
。
我想你想要这样的东西:
public class Hand {
Deck deck;
ArrayList<Card> myHand = new ArrayList<Card>();
Hand(Deck deck) {
this.deck = deck;
}
public void removeCard(Card card) {
deckObject.deck.remove(card);
}
public void Draw() {
for(int i = 0; i <= 4; i++) {
myHand.add(deckObject.deck.get(0));
deckObject.deck.remove(0);
}
}
}
接着
Deck deck = new Deck();
Hand hand1 = new Hand(deck);
Hand hand2 = new Hand(deck);
hand1.Draw();
hand2.Draw();
FYI
Draw
)。 List<Card> myHand
通常是首选,因为它具有更高的抽象级别。 我会在你的Hand
方法Draw()
尝试这个,它应该真正命名为draw()
。
if (deckObject.deck.size() > 0) { // Are there cards in the deck?
myHand.add(deckObject.deck.remove(0)); // add the card removed from
// the deck to the Hand.
} else {
break; // No cards.
}
// deckObject.deck.remove(0); // Already taken care of.
一般来说,你不希望别人搞乱你对象的内部状态。 相反,您希望提供允许其他对象与其交互的方法,例如......
public class Deck {
private ArrayList<Card> deck = new ArrayList<Card>();
Deck(){ //Build the deck in order.
for(int suit = 1; suit <= 4; suit++){
for(int rank = 1; rank <= 13; rank++){
Card card = new Card(rank, suit);
deck.add(card);
}
}
}
public Card[] draw(int count) {
Card[] cards = new Card[count];
if (count < deck.size()) {
for(int i = 0; i < count; i++){
cards[i] = deckObject.deck.remove(0);
}
} else {
throw new IllegalStateException("Can not with draw " + (count + 1) + " from deck that only has " + deck.size() + " cards");
}
return cards;
}
这样,您可以保护Cards
的内部状态,同时提供其他对象与您的Deck
交互的能力
这也涉及到一个地方的管理和逻辑,所以它总是一样的......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.