2013-05-13 4 views
6

Java에서 ArrayList의 자체 구현을 만들려고합니다. 목록이 변경되면이를 청취하고 이러한 일이 발생할 때 작업을 수행 할 수 있습니다. 필자가 읽은 바로는 ArrayList를 확장 한 다음 리스너를 추가 할 수 없다는 것을 이해합니다.Java의 ArrayList에 리스너를 추가하는 방법

public 수정자를 사용하여 클래스의 MyList를 변수로 사용하고자하므로 사용자가 직접 변경할 수 있으며 변경 한 후에 작업을 수행 할 수 있습니다.

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

귀하의 질문은 무엇입니까? –

+0

'ArrayList' 클래스는 final로 표시되지 않기 때문에 확장 할 수 있습니다. 그러나 청취자가있는 목적은 무엇입니까? 'ArrayList'에 의해 백업 된'List'를 사용하는 클래스를 가지는 것이 좋을 것이고'add' 메쏘드에는 내부리스트가 변경되었다는 것을 다른 사람들에게 알리는 리스너가 있습니다. –

+0

리스너를 원한다는 말은하지 않습니다. MyList가 변경되면 조치를 취하고 싶습니다. 구현 방법을 모르겠습니다. – Xelian

답변

10

ArrayList을 확장하면이 기능을 사용할 수 없게됩니다. 알림 메커니즘이 내장되어 있지 않기 때문에 (그리고 더구나 final이라고 선언되어 확장 할 수 없기 때문에). 그러나 add()remove() 방법을 자신의 List 구현을 작성하고 마주 마주하여 '리스너'기능을 추가하여 원하는 결과를 얻을 수 있습니다

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에 목록 = 새로운 MyList (); list.add ("one") MyList list2 = new MyList (); list2 = list1' 이 경우에도 조치가 발생합니다. – Xelian

+0

나는 당신이 무엇을 의미하는지 모르겠다. MyList <>가 초기화 될 때마다 당신이 무언가를하기를 원하는 것처럼 보인다. 그렇다면 그 기능을 생성자에 추가하기 만하면됩니다. 그렇지 않다면, 당신이해야 할 일에 대한 자세한 설명과 함께 질문을 편집하십시오. – drewmoore

+0

목록을 초기화 할 때가 아니라 한 변수의 값을 다른 것으로 참조 할 때 무언가를하고 싶습니다. 'list = list1' 여기서 생성자는 사용되지 않습니다 (또는 잘못되었습니다). 그러나 ** 목록 **의 가치가 변경되었습니다. – Xelian

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; 
    } 

} 
관련 문제