gpt4 book ai didi

java - 监视对集合的更改

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:40:23 27 4
gpt4 key购买 nike

假设您有以下 java bean:

public class MyBean
{
private List<String> names = new ArrayList<String>();

public void addName(String name)
{
names.add(name);
fireNamesPropertyChange(name);
}
}

您通常如何为集合实现属性更改事件?您是否尝试使用 index 属性,它似乎更适用于数组而不是集合?

最佳答案

(注意:我在意识到自己的一些错误后更新了这篇文章,所以这不是原来的,而是更精致的)

为此,我将创建两个新接口(interface),ListListenerListenable,然后我将创建一个新类,如 ListenableArrayList,它将通过调用 ListListener 中定义的一个(或多个)相关方法来包装每个 List 方法。在代码中它会是这样的:

public class ListenableArrayList<T> extends ArrayList<T>
implements Listenable<T> {

private ArrayList<T> internalList;
private ListListener<T> listener;

/* .. */

public void add(T item) {
listener.beforeAdd(T item);
internalList.add(item);
listener.afterAdd(T item);
}

/* .. */

public void setListener(ListListener<T> listener) {
this.listener = listener;
}

}

public interface ListListener<T> {
/* .. */
void beforeAdd(T item);
void afterAdd(T item);
/* .. */
}

public interface Listenable<T> {
/* .. */
void setListener(ListListener<T> listener);
/* .. */
}

我这样做的原因是允许动态创建真正的临时监听器,而不是将 ListenableArrayList 绑定(bind)到某些特定的实现。例如,以下内容是可能的:

Listenable<String> list = new ListenableArrayList<String>();

list.setListener(new ListListener<String>() {
@Override
public void beforeAdd(String item) {
System.out.println("About to add element "+item+"...");
}
@Override
public void afterAdd(String item) {
System.out.println("...element "+item+" has been added.");
}
});

可能有点困惑,但另一方面,这将允许很容易地扩展到 Collections、Sets 等等。

关于java - 监视对集合的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/553067/

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