Ссылка на Java WeakHashMap не обновляется - PullRequest
0 голосов
/ 18 сентября 2009

В приведенном ниже коде я создаю объект Pen и инициализирую его цвет белым. В конструкторе Pen, после установки поля 'penColor' в значение, переданное в конструктор, я обновляю глобальный статический слабый хэш-файл, который я храню там, где КЛЮЧ является 'указателем' - в моем случае это Pen, и value - еще одна weakhashmap, ключом которой является строка "penColor", а значением является ссылка на поле члена penColor.

Затем мой код обновляет цвет пера с помощью вызова функции setColor пера. Я бы подумал, что после этого обновления, если я посмотрю поле цвета объекта «Перо» в моей weakhashmap, он будет отражать новый цвет, но это не так. Может кто-нибудь объяснить, почему это так?

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;

    }

}

1 Ответ

5 голосов
/ 18 сентября 2009

Вы помещаете ссылку на объект Color на карту, а не Pen . Если вы поместите Pen на карту, а затем спросите цвет пера, вы увидите изменение.

Если говорить очень упрощенно, то, что вы делаете, похоже на:

Pen pen = new Pen(Color.WHITE);
Color color = pen.penColor;
pen.setColor(Color.BLACK);
// color here still refers to Color.WHITE, not Color.BLACK.
...