gpt4 book ai didi

java - 使数组不可变

转载 作者:行者123 更新时间:2023-12-01 18:03:31 24 4
gpt4 key购买 nike

我正在创建扑克模拟器用于学习目的,但在使 Deck 类不可变时遇到问题。

public class Deck {

private final Card[] cards;
private int cardCount;

public Deck(@NotNull Card[] c) {
this.cards = Arrays.copyOf(c, c.length);
this.cardCount = c.length - 1;
}

public Deck shuffle() {
// shuffle logic
return new Deck(this.cards);
}

public Card pop() {
return this.cards[cardCount--];
}
// other methods
}

Dealer 类保存 Deck 引用并实现发牌逻辑。

public class Dealer {

private final Deck deck;

public Dealer(@NotNull Deck d) {
this.deck = d;
}

public void deal(@NotNull Holder<Card> h) {
h.hold(deck.pop());
}
// other methods
}

如您所见,Deck 并不是完全不可变的,因为它保存 cardCount,每次调用 pop 时都会更新。 !注意 - cardCount 对外部不可见,而且 Card 类也是不可变的。

问题 1:此设计如何影响 Deck 不变性?

问题 2: future 可能产生什么影响?

问题 3:是否值得使 Deck 类完全不可变?如果是,那么如何?

感谢您的帮助。

最佳答案

这是少数几个不变性无济于事的情况之一。您似乎需要一个可变的共享状态,因为这是该 Deck 的全部目的。

要使其不可变,意味着每次有人弹出一张牌时,您都必须使用剩​​余的牌创建一个新的Deck。但是你无法控制旧的Deck(在移除顶部卡片之前),因此这可能仍然被某些客户端引用 - 在我看来,这违背了游戏的整个目的。

使用当前的实现,您可能会遇到多个线程的问题,因此请考虑使您的类线程安全。使用 java.util.Stack 而不是带有计数器的数组将是一个很好的首次尝试。

关于java - 使数组不可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38799624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com