PropertyChangesUpport 및 동등한 방법
-
05-07-2019 - |
문제
내 문제를 최대한 명확하게 설명하려고 노력할 것입니다. :). 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 클래스에 이벤트 체인을 따르고 첫 번째 이벤트를 반환하는 정적 메소드를 가지고 있습니다.