监控集合的更改

wil*_*ood 6 java javabeans observer-pattern

假设您有以下java bean:

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

    public void addName(String name)
    {
        names.add(name);
        fireNamesPropertyChange(name);
    }
}
Run Code Online (Sandbox Code Playgroud)

您通常如何为集合实现属性更改事件?您是否尝试使用索引属性,这对于数组而言似乎比集合更多?

Esk*_*sko 9

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

为此我做了两个新的接口,ListListener并且Listenable然后我会创造一个新的类像ListenableArrayList这将每个包裹List的方法与调用中定义一个(或多个)的相关方法ListListener.在代码中它是这样的:

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);
    /* .. */
}
Run Code Online (Sandbox Code Playgroud)

我这样做的原因是允许动态创建真正的临时侦听器,而不是将ListenableArrayList绑定到某个特定的实现.例如,有了以下可能:

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.");
    }
});
Run Code Online (Sandbox Code Playgroud)

有点混乱,但另一方面,这将允许容易扩展到集合,集合等等.


Pet*_*aný 8

看看Glazed Lists库,它支持可观察的集合.

如果我自己这样做,我可能会创建自定义的Listener接口,其中包含elementsAdded,elementsRemoved方法或类似方法:-)(也取决于我的需求)