当前位置:  开发笔记 > 编程语言 > 正文

监控集合的更改

如何解决《监控集合的更改》经验,为你挑选了2个好方法。

假设您有以下java bean:

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

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

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



1> Esko..:

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

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

public class ListenableArrayList extends ArrayList
                                    implements Listenable {

    private ArrayList internalList;
    private ListListener listener;

    /* .. */

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

    /* .. */

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

}

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

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

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

Listenable list = new ListenableArrayList();

list.setListener(new ListListener() {
    @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.");
    }
});

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



2> Peter Štibra..:

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

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

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有