سؤال

هل هناك نسخة من أي منهما java.beans.PropertyChangeSupport أو com.jgoodies.binding.beans.ExtendedPropertyChangeSupport ما هو مفيد لدعم مستمعي التغيير على غرار الخريطة أو enummap؟ (متجر القيمة الرئيسية مع مفاتيح محدودة معروفة وتغيير المستمعين لجميع القيم في الخريطة)

لا أحتاج حقًا إلى وصول من نوع الفاصوليا ، ولدي عدد من الإحصائيات المختلفة مثل:

interface hasName() {
    public String getName();
}

enum StatisticType implements hasName {
    MILES_DRIVEN, BURGERS_SERVED, CUSTOMERS_HELPED, BIRDS_WATCHED;
    @Override public String getName() { return name(); }
}

حيث أريد نشر واجهة مثل:

interface KeyValueStore<K extends hasName,V>
{
    void setValue(K key, V value);
    V getValue(K key);

    void addPropertyChangeListener(PropertyChangeListener listener);
    void removePropertyChangeListener(PropertyChangeListener listener);        
    /*
     * when setValue() is called, this should send PropertyChangeEvents
     * to all listeners, with the property name of K.getName()
     */
}

لذلك يمكنني استخدام أ KeyValueStore<StatisticType, Integer> في طلبي.

هل هناك أي طريقة مريحة للقيام بذلك؟ رأسي يدور حول دوائر وهو يتجول في طاقتي في محاولة لإعادة اختراع العجلة على هذه الأشياء.

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

المحلول

ما لم يكن هناك سبب ملحة لعدم ذلك ، أود أن أمتد Map والاستخدام put و get بدلاً من setValue و getValue.

لدي واجهة أستخدمها غالبًا:

public interface PropertyChangeNotification {
    void addPropertyChangeListener(String property, PropertyChangeListener listener);
    void removePropertyChangeListener(String property, PropertyChangeListener listener);
    void addPropertyChangeListener(PropertyChangeListener listener);
    void removePropertyChangeListener(PropertyChangeListener listener);
}

مع ذلك ، تصبح واجهتك:

interface KeyValueStore<K extends hasName,V>
    extends Map<K,V>, PropertyChangeNotification
{
}

ثم ينتهي تطبيقك يبدو أن شيئًا كهذا:

public class MyKeyStore<K extends hasName, V>
    extends HashMap<K,V>
    implements KeyValueStore<K,V>
{
    private PropertyChangeSupport changer = new PropertyChangeSupport(this);

    public void put(K key, V value)
    {
        V old = get(K);
        super.put(key,value);
        changer.firePropertyChange(key.getName(), value, old);
    }
}

غير معروضة هي الطرق الأربعة لوظيفة تخصيص property changer.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top