假设您有以下java bean:
public class MyBean { private Listnames = new ArrayList (); public void addName(String name) { names.add(name); fireNamesPropertyChange(name); } }
您通常如何为集合实现属性更改事件?您是否尝试使用索引属性,这对于数组而言似乎比集合更多?
(注意:我在发现自己的一些错误后更新了这篇文章,所以这不是原版,而是更精致的一个)
为此我做了两个新的接口,ListListener
并且Listenable
然后我会创造一个新的类像ListenableArrayList
这将每个包裹List
的方法与调用中定义一个(或多个)的相关方法ListListener
.在代码中它是这样的:
public class ListenableArrayListextends 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绑定到某个特定的实现.例如,有了以下可能:
Listenablelist = 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."); } });
有点混乱,但另一方面,这将允许容易扩展到集合,集合等等.
看看Glazed Lists库,它支持可观察的集合.
如果我自己这样做,我可能会创建自定义的Listener接口,其中包含elementsAdded,elementsRemoved方法或类似方法:-)(也取决于我的需求)