2009-09-18 48 views
0

在下面的代码中,我创建了一个Pen对象并将它的颜色初始化为白色。在Pen的构造函数中,将字段'penColor'设置为传递给构造函数的值之后,我更新了一个全局静态弱散列表,我保留KEY的位置'this pointer - 在我的情况下是Pen,值是另一个weakhashmap,其KEY是字符串“penColor”,其值是对penColor成员字段的引用。Java WeakHashMap参考没有更新

接下来,我的代码通过调用Pen的setColor函数来更新Pen的颜色。我会认为在更新之后,如果我在我的弱散焦图中查找Pen对象的颜色字段,它会反映新的颜色,但它不会。有人可以解释为什么吗?

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; 

    } 

} 

回答

5

你把到颜色对象的引用到地图,而不是。如果您将放入地图中,稍后再询问笔的颜色,则会看到更改。

说得非常简单的术语,你在做什么是类似于:

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

约翰嗨, 感谢您的及时回复。我想我明白你在说什么,但仍然很难消化。笔的颜色与笔的颜色有何不同。他们不是两个引用?注意我将笔保存在地图中,作为KEY。 – 2009-09-18 17:57:26

+0

您将笔保留为关键字,但您将*初始颜色*用作值。它只是一个对象的引用 - 它不是对表达式“this.penColor”或类似的东西的引用。 – 2009-09-18 18:02:32

+0

我应该接受你的理解吗?如果没有,请添加更多评论,我们可以根据您的喜好进行更改。我认为值得从等式中去掉嵌套地图 - 它们并不真正相关,但它们可能会让你更难想象。 – 2009-09-18 18:03:36