2013-05-13 142 views
6

我想在java中创建自己的ArrayList实现,它可以监听列表何时发生变化并在发生这种情况时执行操作。 从我已阅读,我明白,我不能扩展ArrayList,然后添加侦听器。如何在java中的ArrayList上添加监听器

我想在课堂上使用MyList作为变量,public修饰符,因此用户可以直接更改它并在他更改时执行操作。

class MyList extends ArrayList<object>.... { ... } 
class UseOfMyList { 
public MyList places = new MyList<Object>(); 
places.add("Buenos Aires"); 
//and to be able to do that 
List cities = new ArrayList<Object>(); 
cities.add("Belmopan"); 
places = cities; 

那么如何创建和何时添加,删除或传递另一个列表MyList一个要执行的操作?

+0

你的问题是什么? – 2013-05-13 19:07:04

+0

您可以扩展'ArrayList'类,因为它没有标记为'final'。但有一个听众在里面的目的是什么?最好是有一个类使用由'ArrayList'备份的'List',并且在其'add'方法中有一个监听器来通知其他人内部列表已经改变。 – 2013-05-13 19:10:19

+0

我不是说我想要听者,我想在MyList改变时做一个动作,我不知道如何实现它。 – Xelian 2013-05-13 19:13:29

回答

10

由于它没有内置的通知机制(因为它已被声明为final因此无法扩展),因此您无法通过扩展ArrayList来完成此操作。但是,您可以通过创建自己的List实现和增加你的“监听”功能相一相的add()remove()方法达到您想要的结果:

class MyList<T>{ 
    private ArrayList<T> list; 

    public MyList(){ 
     list = new ArrayList<>(); 
    ... 
    } 
    public void add(T t){ 
     list.add(t) { 
     //do other things you want to do when items are added 
     } 
    public T remove(T t){ 
      list.remove(t); 
      //do other things you want to do when items are removed 
+0

好的,但是我想捕捉的情况下: 'MYLIST 列表= new MyList (); list.add(“one”) MyList list2 = new MyList (); list2 = list1' 并且当这种情况发生时也是如此。 – Xelian 2013-05-13 19:31:38

+0

我不太确定你的意思......看起来你想要在MyList <>被初始化时执行某些操作?如果是这样,只需将该功能添加到构造函数即可。如果没有,请编辑您的问题,并详细说明您需要做什么。 – drewmoore 2013-05-13 19:38:47

+0

我不想在列表初始化的时候做某些事情,但是当将一个变量的值保留到另一个变量的值时。 'list = list1' 这里没有使用构造函数(或者我错了)。但**列表**的值已经改变。 – Xelian 2013-05-13 20:01:59

0

的RESP。 ;)

private class MyList extends ArrayList<Objects> { 

     @Override 
     public void sort(Comparator c) { 
     super.sort(c); 
     resetLancamentos(); // call some metod ;) 
     } 
    //... 
    @Override 
    public boolean removeAll(Collection c) { 
     //To change body of generated methods, choose Tools | Templates. 
     boolean ret = super.removeAll(c); 
     resetLancamentos(); // some metod like fireObjChanged() will do the job too 
     return ret; 
    } 

}