作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建扑克模拟器用于学习目的,但在使 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/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!