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)
您通常如何为集合实现属性更改事件?您是否尝试使用索引属性,这对于数组而言似乎比集合更多?
(注意:我在发现自己的一些错误后更新了这篇文章,所以这不是原版,而是更精致的一个)
为此我做了两个新的接口,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)
有点混乱,但另一方面,这将允许容易扩展到集合,集合等等.
看看Glazed Lists库,它支持可观察的集合.
如果我自己这样做,我可能会创建自定义的Listener接口,其中包含elementsAdded,elementsRemoved方法或类似方法:-)(也取决于我的需求)