Question

Dans le code ci-dessous, je crée un objet Pen et initialise sa couleur en blanc. Dans le constructeur de Pen, après avoir défini le champ 'penColor' sur la valeur transmise au constructeur, je mets à jour un hashmap statique faible global que je garde où la clé est le 'ce pointeur - dans mon cas un stylo, et le La valeur est un autre fichier faibles dont la clé est la chaîne "penColor". et dont la valeur est une référence au champ de membre penColor.

Ensuite, mon code met à jour la couleur du stylo en appelant la fonction setColor du stylo. J'aurais pensé qu'après cette mise à jour, si je levais les yeux sur le champ de couleur de l'objet Plume dans ma faiblehashmap, cela refléterait la nouvelle couleur, mais ce n'est pas le cas. Quelqu'un peut-il expliquer pourquoi?

package weakhashmaptest;


import java.awt.Color;
import java.util.WeakHashMap;
import java.util.Iterator;

public class Main {

    static WeakHashMap <Object, WeakHashMap>ownerMap = new WeakHashMap<Object, WeakHashMap>();

    public static void main(String[] args) {

        Pen r = new Pen(Color.WHITE);

        Iterator i = ownerMap.keySet().iterator();

        while(i.hasNext()) {
            Object key = i.next();
            System.out.println("\telement of hashmap is : " +ownerMap.get(key));
        }

        r.setColor(Color.BLACK);

        System.gc();

        i = ownerMap.keySet().iterator();

        while(i.hasNext()) {
            Object key = i.next();
            System.out.println("\telement of hashmap is : " +ownerMap.get(key));
        }

    }

    public static void mapUpdate(Object owner, Object reference, String field_name) {

        WeakHashMap reference_map = ownerMap.get(owner);

        if (reference_map == null) {         
            reference_map = new WeakHashMap();
            reference_map.put(field_name, reference);
        } else {         
            reference_map.put(field_name, reference);
        }

        ownerMap.put(owner, reference_map);

    }

}

class Pen {

    Color penColor;

    public Pen(Color c) {

        penColor = c;
        Main.mapUpdate(this, penColor, "penColor");

    }

    public void setColor(Color c) {

        penColor = c;

    }

}
Était-ce utile?

La solution

Vous mettez une référence à l'objet Couleur dans la carte, plutôt qu'au Stylo . Si vous insérez le stylo dans la carte, puis que vous demandiez plus tard la couleur du stylo, vous verrez le changement.

En termes très simplistes, ce que vous faites est similaire à:

Pen pen = new Pen(Color.WHITE);
Color color = pen.penColor;
pen.setColor(Color.BLACK);
// color here still refers to Color.WHITE, not Color.BLACK.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top