Ich erschaffe Poker-Simulator für Lernzwecke, aber Probleme haben Deck
Klasse unveränderlich.Array unveränderlich machen
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
Klasse hält Deck
Referenz und Logik zu tun implementiert.
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
}
Wie Sie Deck
sehen kann, ist nicht völlig unveränderlich, weil es cardCount
hält, die jedes Mal aktualisiert wird, wenn pop
genannt wird. ! Hinweis - cardCount
ist nicht nach außen sichtbar, auch Card
Klasse ist unveränderlich.
Frage 1: Wie wirkt sich dieses Design auf Deck
Unveränderlichkeit?
Frage 2: Was könnte zukünftige Auswirkungen haben?
Frage 3: Ist es wert, Deck
Klasse völlig unveränderlich zu machen? Wenn ja, wie?
Vielen Dank für Ihre Hilfe.
Es ist nicht nur der Zähler, der Ihre Klasse veränderbar macht, sondern auch das Array, da Arrays von Natur aus änderbar sind, obwohl Ihre Referenz "final" ist. –
Ich mache defensive Kopien für Arrays. –
Das eigentliche Problem hier ist "Pop", das Sie als eine mutative Operation entworfen haben. Kein internes Fiedeln wird Ihr 'Deck' unveränderlich machen, solange es noch eine' Pop'-Methode mit der gegebenen Semantik unterstützen muss. – user2357112