문제

내 문제를 최대한 명확하게 설명하려고 노력할 것입니다. :). PropertyChangesUpport를 사용하여 부동산 변경 사항에 대해 등록 된보기에 알리고 있습니다. 속성 중 하나는 매 초마다 속성이 변경되는 객체입니다. 이 특정 객체가 업데이트 될 때마다 (PropertyChangelistener가 변경 사항을 알아 차리기 위해) 새 인스턴스를 만들고 싶지 않으므로 자체를 비교하는 내 자신의 평등 방법을 작성했습니다.

@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;
}

불행한 사람은 내가 찾고 있던 효과가 없습니다. 객체의 사본을 만들고 속성 변경 방법을 발사하면 잘 작동합니다.

내가 여기서 무엇을 놓치고 있습니까?

-- 편집하다

나는 사본이 아닌 동일한 인스턴스를 사용하고 있기 때문에 속성이 같은 장소에있어서 비교가 항상 실현된다는 것을 깨달았습니다. 이에 대한 해결 방법이 있습니까 (사본을 만드는 것 외에도). 또는 매초마다 객체의 사본을 만드는 것이 얼마나 나쁜가.

도움이 되었습니까?

해결책

항상 돌아와야합니다 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 ~로 어린이. 자녀가 부모에게 추가되면 부모는 자녀에 필요한 청취자를 설치해야합니다. 이벤트가 해고되면 청취자에게 부모의 의 변화의 어린이 (부모는 이벤트를 전달해야합니다).

다른 팁

이것은 체인 재산의 사례입니다.

TransferQueueItem은 삽입 된 Transferque에 의해 들어야하는 자체 PropertyChangeEvents를 시작해야합니다.

그리고 응답으로 Transferque는 청취자에게 소유 품목이 변경되었음을 알려야합니다.

객체가 이벤트를 다시 시작 해야하는 이와 같은 문제가있을 때 마다이 컨벤션을 사용합니다 (직장 팀).

1 객체는 소스 자체 인 이벤트 만 시작할 수 있습니다.

2 대의원 이벤트를 원한다면 다음과 같은 이벤트를 시작합니다. New PropertyChangeEvent (this, "delegated_event", null, recipevent). 청취자가 일련의 사건을 따를 수 있도록.

중독자는 UTIL 클래스에 이벤트 체인을 따르고 첫 번째 이벤트를 반환하는 정적 메소드를 가지고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top