目前正在执行的项目要求我确保在遍历地图的条目时,如果调用Entry.setValue,则将触发值更改事件。我看到我可以尝试在.put方法的Map类扩展中添加侦听器。我的问题是,更改条目会触发地图的put方法中的侦听器吗?还是会被迫扩展Map.Entry类并将侦听器逻辑粘贴到其setValue方法中?
如果这个问题是愚蠢的,请事先道歉-以这种方式使用Maps是新手,到目前为止,许多信息ive仅导致扩展Map本身,这似乎最简单,但我不知道它是否可以涵盖我的情况。
您可以在紧急情况下使用PropertyChangeSupport
该类。这使得管理propertyChanges
非常容易。这里没有太多要说的。想要侦听更改的各方将其侦听器注册到地图。然后,当映射修改该值时,支持将向所有侦听器触发一个事件。在Event类中返回的值可以更改为选择的值。
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.HashMap;
public class PropertyChangeDemo implements PropertyChangeListener {
public static void main(String[] args) {
// leave static context of main
new PropertyChangeDemo().start();
}
public void start() {
MyMap<String,Integer> map = new MyMap<>();
map.addMapListener(this);
map.put("B",20);
map.put("B",99);
map.put("A",44);
map.entrySet().forEach(System.out::println);
}
版画
source = map
oldValue = null
newValue = 20
source = map
oldValue = 20
newValue = 99
source = map
oldValue = null
newValue = 44
A=44
B=99
一个听众进行示范。
public void propertyChange(PropertyChangeEvent pce) {
System.out.println("source = " + pce.getPropertyName());
System.out.println("oldValue = " + pce.getOldValue());
System.out.println("newValue = " + pce.getNewValue());
}
}
修改后的类
class MyMap<K,V> extends HashMap<K,V> {
private PropertyChangeSupport ps = new PropertyChangeSupport(this);
// method to add listener
public void addMapListener(PropertyChangeListener pcl) {
ps.addPropertyChangeListener(pcl);
}
@Override
public V put(K key, V value) {
V ret = super.put(key,value);
ps.firePropertyChange("map", ret, value);
return ret;
}
}
注意:此简单解决方案可能遗漏了一些问题。测试应在投入生产之前进行。首先,有很多不同的方法来设置Entry's
值。这仅put
在由用户或由地图本身间接调用时才执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句