سؤال

وسأحاول أن أشرح مشكلتي واضحة قدر الإمكان :). أنا أستخدم PropertyChangeSupport بإخطار جهات النظر مسجلة لإجراء تغييرات في الخصائص. واحدة من الممتلكات هو كائن التي يتم تغيير خصائص كل رأي ثواني. أنا لا أريد أن إنشاء لهذا الكائن مثيل جديد خاص في كل مرة يتم تحديثه (لpropertychangelistener لاحظت التغيير)، لذلك كتبت بلدي يساوي طريقة أين أنا ommit وcomparation لنفسها.

@Override
public boolean equals(Object item) {
    // do not compare 
    // if (this == item) { return true; }

    if (!(item instanceof TransferQueueItem) || 
        item == null) {

        return false;
    }

    TransferQueueItem newItem = (TransferQueueItem) item;
    boolean value = 
            // ommited... properties comparation
    return value;
}

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

ما أنا في عداد المفقودين هنا؟

و- تحرير

وأدركت، أنه منذ أنا باستخدام نفس المثال وليس على نسخة منه، خصائص وpointig نفس المكان، وبالتالي فإن comparation سيأتي دائما صحيحا. هل هناك حل لذلك (إلى جانب إنشاء نسخة). أو كيف السيئ هو لإنشاء نسخة من كائن في كل ثانية، على سبيل المثال.

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

المحلول

ويجب عليك دائما العودة true أن أقول PropertyChangeSupport أن الكائن لم <م> لا تغير. ولكن هذا يعني مكسورة equals() لكافة الكائنات من هذه الفئة (بحيث لا يمكن استخدامها في مجموعات أو الخرائط بعد الآن، على سبيل المثال).

وهناك طريقة أفضل سيكون لديك firePropertyChange() أسلوب خاص لهذا النوع من الكائن الذي يقوم معالجة خاصة. بهذه الطريقة، يمكنك حتى تجنب إنشاء مثيل من PropertyChangeEvent أيضا. هنا هو مثال للتعامل مع BigDecimal (حيث لا تعمل equals() على الإطلاق):

protected transient PropertyChangeSupport changeSupport = null;

public void addPropertyChangeListener (String propertyName, PropertyChangeListener listener)
{
    if (changeSupport == null)
        changeSupport = new PropertyChangeSupport (this);

    changeSupport.addPropertyChangeListener (propertyName, listener);
}

public void firePropertyChange (String propertyName, BigDecimal oldValue, BigDecimal newValue)
{
    if (changeSupport == null)
        return;

    if (oldValue != null && newValue != null && oldValue.compareTo (newValue) == 0) {
        return;
    }
    changeSupport.firePropertyChange(new PropertyChangeEvent(this, propertyName,
                                               oldValue, newValue));
}

[تحرير] ما عليك فعله هو شيء آخر تماما: لديك أحد الوالدين وطفل وتريد المستمعين من الأم لتلقي الأحداث عندما <م> الأطفال التغييرات.

والمنهج الصحيح هنا هو إضافة PropertyChangeSupport إلى <م> الأطفال . عند إضافة الطفل إلى الأم، يجب على الوالدين تثبيت المستمعين الضروري في الطفل. عندما يتم تشغيل هذا الحدث، يجب أن إطلاق الحدث الثاني الذي يبلغ المستمعين من الأم التغيير في الأطفال (الأصل يجب إعادة توجيه الأحداث).

نصائح أخرى

وهذا هو حال propertychangelisteners بالسلاسل:

وTransferQueueItem يجب إطلاق PropertychangeEvents الخاصة بهم والتي يجب ان يستمع من قبل TransferQueue التي يتم إدراجها

وردا TransferQueue أن يخطر مستمعيهم أن عنصر المملوكة قد تغير.

وفي كل مرة لدي مشكلة من هذا القبيل في أي كائن يجب إعادة إطلاق أحداث يمكنني استخدام هذه الاتفاقية (من فريق عملي):

1 كائن يمكن إطلاق فقط الأحداث المصدر الذي هو في حد ذاته.

2 إذا أردت الحدث مندوب أنه launchs حدث مثل هذا: PropertyChangeEvent الجديد (هذا "DELEGATED_EVENT"، لاغية، receivedEvent). بحيث يمكن للمستمعين متابعة سلسلة من الأحداث.

وAddicionally لدي أسلوب ثابت في فئة UTIL التي تتبع سلسلة الأحداث وإرجاع الحدث الأول جدا، واحد ويك العقار لم يعد "DELEGATED_EVENT"

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