2013-05-13 13 views
6

Voglio creare la mia implementazione di ArrayList in java, che può ascoltare quando la lista cambia e fare azione quando ciò accade. Da quello che ho letto, capisco che non posso estendere ArrayList e quindi aggiungere listener.Come aggiungere listener su ArrayList in java

Desidero utilizzare MyList in classe come variabile con modificatore pubblico, in modo che gli utenti possano modificarlo direttamente e fare un'azione quando lo modifica.

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; 

Quindi, come creare e quando non aggiungere, rimuovere o passare un altro elenco di myList un'azione da eseguire?

+0

Qual è la tua domanda? –

+0

È possibile estendere la classe 'ArrayList' poiché non è contrassegnata come' finale'. Ma qual è lo scopo di avere un ascoltatore al suo interno? Sarebbe meglio avere una classe che utilizza un 'List' di cui è stato eseguito il backup di un' ArrayList' e nel suo metodo 'add' ha un listener che notifica agli altri che l'elenco interno è cambiato. –

+0

Non dico che voglio ascoltatore, voglio fare un'azione quando MyList cambia, non so come implementarlo. – Xelian

risposta

10

Non sta andando ad essere in grado di farlo estendendo ArrayList, in quanto non ha meccanismo di notifica integrato (e, inoltre, perché è stata dichiarata final e quindi non può essere esteso). Tuttavia, è possibile ottenere il risultato desiderato creando il proprio List implementazione e aggiungendo la funzionalità "ascoltatore" vis a vis i add() e remove() metodi:

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

Ok, ma voglio prendere il caso: 'MyList list = new MyList (); list.add ("one") MyList list2 = new MyList (); list2 = list1' e quando succede anche a farlo. – Xelian

+0

Non sono abbastanza sicuro di cosa intendi ... Sembra che tu voglia fare qualcosa ogni volta che un 'MyList <>' viene inizializzato? In tal caso, aggiungi tale funzionalità al costruttore. In caso contrario, modifica la domanda con una descrizione completa di ciò che devi fare. – drewmoore

+0

Voglio fare qualcosa non quando la lista si sta inizializzando ma quando si fa riferimento al valore di una variabile a un'altra. 'list = list1' Qui il costruttore non è usato (o ho torto). Ma i valori della ** lista ** sono cambiati. – Xelian

0

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

}