2017-05-08 3 views
0

Je souhaite implémenter l'annulation d'opération dans le jeu solitaire. J'ai créer une fonction save qui va copier l'état actuel des éléments et la charge de la fonction qui remplacera les éléments réels avec ces copies. Mais quand j'appelle la fonction save avant une opération avec la carte, la fonction sauvegarde les valeurs mais quand la source de ces valeurs change, ces variables changent aussi.Les variables définies dans la fonction sont constamment modifiées

Ces variables sont définies dans cette classe avant constructeur:

public class Game extends javax.swing.JPanel 

comme celui-ci

ArrayList<CardStack> undo_card_stack1 = new ArrayList<>(); 

Fonction save_undo copie simplement état réel des valeurs à ces undo valeurs comme ceci:

private void save_undo() 
{ 
    undo_card_stack1.add(working_pack1_stack); 
    undo_card_stack2.add(working_pack2_stack); 
.... 

La fonction est des appels avant chaque action avec une carte - carte est JLabel. Ce qui n'est pas clair pour moi, c'est pourquoi lors du débogage de cette partie du code, les valeurs sont correctement définies après les appels save_undo(), mais après une opération avec pop et quelques lignes après, les valeurs sont réécrites.

private void start_deckMouseClicked(java.awt.event.MouseEvent evt) {           

    save_undo(); 
    discardPile_card = null; 
    if (!deck.isEmpty()) 
    { 

     discardPile.deck.push(deck.pop()); 
     ... 

charge de fonction ne juste en face de sauvegarde et des appels lorsque le bouton cliqué:

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {           
    load_undo(); 
} 

Répondre

1

Si working_pack1_stack est mutable (peut être modifié), il est possible qu'il soit changé, même après qu'il a été ajouté à ArrayList. Tout ce que vous faites est d'ajouter une référence à la pile à ArrayList. Si vous modifiez la pile, n'importe où avec une référence, y compris la liste, sera également modifiée.

Faites une copie de votre objet pile et ajoutez-le à la liste pour l'empêcher d'être modifié par du code externe.

+0

Merci, quelle est la meilleure et la plus rapide façon de faire une copie de ces objets? –

+0

@ TomášDubovský Difficile à dire sans voir le code de votre classe CardStack. Si c'est juste un wrapper sur une ArrayList, créez juste une nouvelle instance de CardStack qui contient une * copie * de la liste. – Carcigenicate

+0

@ TomášDubovský Créez un "constructeur de copie" pour votre classe CardStack afin de faciliter les copies. Faites un constructeur qui accepte un CardStack, puis demandez au constructeur de l'utiliser pour faire une copie. – Carcigenicate