gpt4 book ai didi

java - 双向bean同步

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:15:32 25 4
gpt4 key购买 nike

如何实现两个绑定(bind)属性之间的双向同步?实用程序类 PropertyChangeSupport 提供了一种避免无限循环的简单机制。在某些情况下,我发现它是不够的。有更好的选择吗?

采用具有 String 有界属性的最简单的类:

private String myProperty;
//obviuos getter and setter omitted. (ok, setter contains propertyChangeSupport.firePropertyChange. should be obvious the same)


public void addPropertyChangeListener(PropertyChangeListener listener) {
//delegate to propertyChangeSupport
}

public void removePropertyChangeListener(PropertyChangeListener listener) {
//delegate to propertyChangeSupport
}

好的。现在,我尝试使用通知,以便在该属性值(由此类的两个实例拥有)之间执行双向同步化。

这是(非常简单的)代码:

 public static void main(String [] args) {

final T01 o1 = new T01();

final T01 o2 = new T01();

o1.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
o2.setMyProperty(o1.getMyProperty());
}
});

o2.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
o1.setMyProperty(o2.getMyProperty());
}
});

o1.setMyProperty("test");

}

这里没有无限循环,因为 PropertyChangeSupport 在返回原始类时抑制通知,因为 oldValue 等于 newValue。
恕我直言,这是一个“微不足道”的实现,而更好的原则可能是“不应将事件通知给引起它的类”。

这种基于“等值”的实现方式存在的问题是:
1. 向更改的原始类提出一个不必要的冗余事件(然后原始类抑制)
2. 当旧值等于新值时抑制事件,如果它是一个新值而不是“返回”值。在大多数情况下,抑制是正确的,但在某些(罕见的)情况下,事件可能是有用的。本身就是“信息”。考虑每次收到事件时必须清除的超时。
3.它有一个“奇怪”的实现。如果你这样做:

o1.setMyProperty(null);  <br/>

你得到了无限循环和随之而来的 stackoverflow。
因为如果值等于且不为空,则事件会被抑制。但在许多情况下,“null”是一个合法的值。

最佳答案

你可以试试jGoodies Binding LibraryPropertyConnector :

final T01 o1 = new T01();
final T01 o2 = new T01();
PropertyConnector.connect(o1, "myProperty", o2, "myProperty").updateProperty2();

现在 o1 的绑定(bind)属性 myProperty 将与 o2 同步,反之亦然。

关于java - 双向bean同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7389870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com