代码之家  ›  专栏  ›  技术社区  ›  Amir Afghani

未更新Java WeakHashMap引用

  •  0
  • Amir Afghani  · 技术社区  · 17 年前

    在下面的代码中,我创建了一个Pen对象,并将其颜色初始化为白色。在Pen的构造函数中,将字段“penColor”设置为传递给构造函数的值后,我更新了一个全局静态弱hashmap,其中键是“this pointer”——在我的例子中是Pen,值是另一个weakhashmap,其键是字符串“penColor”,其值是对penColor成员字段的引用。

    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 回复  |  直到 17 年前
        1
  •  5
  •   Jon Skeet    17 年前

    你在引用 颜色 对象,而不是 . 如果你把 笔 在地图上,然后询问钢笔的颜色,你会看到变化。

    简单地说,您所做的类似于:

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