سؤال

في التعليمات البرمجية أدناه I إنشاء كائن القلم وتهيئة انها اللون إلى الأبيض. في منشئ القلم، بعد تعيين الحقل "penColor" إلى القيمة التي تم تمريرها إلى المنشئ، I تحديث hashmap ضعف ثابت العالمي الذي أنا حفظ حيث KEY هو 'هذا المؤشر - في حالتي القلم، و القيمة weakhashmap آخر الذي KEY هو سلسلة "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;

    }

}
هل كانت مفيدة؟

المحلول

وأنت تضع إشارة إلى <م> اللون الكائن في الخريطة، بدلا من القلم . إذا قمت بوضع <م> القلم إلى الخريطة، ثم طلب للون القلم في وقت لاحق على، كنت انظر التغيير.

لوضعها من حيث غاية في التبسيط، ما تفعلونه هو مماثل ل:

Pen pen = new Pen(Color.WHITE);
Color color = pen.penColor;
pen.setColor(Color.BLACK);
// color here still refers to Color.WHITE, not Color.BLACK.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top