D4rkAng3l
12-05-2009, 20:05
Ciao,
studiando Java sono arrivato a vedere gli iteratori...vi faccio qualche domanda relativa ad un esempio giocattolo fatto dalla professoressa.
Da quello che ho capito uso il meccanismo degli iteratori per poter scorrere collezioni di oggetti in modo standard per tutti i tipi di collezioni senza dover scendere a basso livello (per esempio impostando un ciclo per scorrere un array o una lista concatenata).
Così quando progetto una collezione di oggetti posso cacciarci dentro una particolare implementazione dell'interface Iterator e chi userà la classe che implementa quella collezione avrà gratis un modo standard per scorrere la collezione....è giusto come concetto del perchè si usano gli iteratori?
Veniamo all'esempio fatto in classe:
public class CollStr{ // Classe che gestisce una collezione di stringhe
private String[] c; // Variabile di istanza: la collezione di stringhe è gestita banalmente da un array di stringhe
int i;
public CollStr(String str[]){ // COSTRUTTORE
// COSTRUISCE L'ARRAY c CHE IMPLEMENTA LA COLLEZIONE IN QUALCHE MODO
}
private class MioIteratore implements Iterator{ // E' una CLASSE INTERNA che implementa l'interface Iterator
private int dove;
public MioIteratore(){ // COSTRUTTORE MioIterator
dove = 0; // Punta al primo elemento dell'array
}
public Object next(){ // Restituisce l'elemento non ancora estratto
return c[dove];
}
public void remove(){
dove ++; // Non elimina l'oggetto dalla collezione malo rimuove solo dall'iteratore
}
public boolean hasNext{
return dove < c.length; // TRUE se ha un elemento successivo, FALSE se non ce l'ha
}
} // CHIUSURA DELLA CLASSE INTERNA
public Iterator enumera(){ // Metodo che restituisce il riferimento ad un oggetto che implementa Iterator
return new MioIteratore(); // Ritorna il riferimento ad un oggetto di tipo MioIteratore appena creato
}
}
La collezione di stringhe viene banalmente rappresentata tramite un array di stringhe (il costruttore non l'ho scritto perchè tanto ai fini di questo argomento mi interessa poco ora come ora)
Poi voglio munirla di un iteratore per poterla scorrere comodamente in modo standard, allora ci ficco dentro una classe interna che ho chiamato MioIteratore che implementa l'interface Iterator e quindi implementa in modo coerente a com'è rappresentata la collezione tutti i metodi presenti dentro Iterator.
Fin quì tutto ok...
La domanda è la seguente....perchè poi fuori alla classe interna (quindi dentro la classe esterna) la proff ha dichiarato il metodo enumera che di fatto restituisce il riferimento ad un MioIteratore? Per comodità?
Ad esempio nel main se volevo iterare non funzionava comunque se creavo un nuovo oggetto di tipo MioIteratore a mano? Oppure non lo vedrei perchè è nella classe interna e quindi devo usare per forza il metodo enumera che è nella classe esterna che a sua volta può comunicare con la classe interna?
Spero di essere stato abbastanza chiaro...
Grazie
Andrea
studiando Java sono arrivato a vedere gli iteratori...vi faccio qualche domanda relativa ad un esempio giocattolo fatto dalla professoressa.
Da quello che ho capito uso il meccanismo degli iteratori per poter scorrere collezioni di oggetti in modo standard per tutti i tipi di collezioni senza dover scendere a basso livello (per esempio impostando un ciclo per scorrere un array o una lista concatenata).
Così quando progetto una collezione di oggetti posso cacciarci dentro una particolare implementazione dell'interface Iterator e chi userà la classe che implementa quella collezione avrà gratis un modo standard per scorrere la collezione....è giusto come concetto del perchè si usano gli iteratori?
Veniamo all'esempio fatto in classe:
public class CollStr{ // Classe che gestisce una collezione di stringhe
private String[] c; // Variabile di istanza: la collezione di stringhe è gestita banalmente da un array di stringhe
int i;
public CollStr(String str[]){ // COSTRUTTORE
// COSTRUISCE L'ARRAY c CHE IMPLEMENTA LA COLLEZIONE IN QUALCHE MODO
}
private class MioIteratore implements Iterator{ // E' una CLASSE INTERNA che implementa l'interface Iterator
private int dove;
public MioIteratore(){ // COSTRUTTORE MioIterator
dove = 0; // Punta al primo elemento dell'array
}
public Object next(){ // Restituisce l'elemento non ancora estratto
return c[dove];
}
public void remove(){
dove ++; // Non elimina l'oggetto dalla collezione malo rimuove solo dall'iteratore
}
public boolean hasNext{
return dove < c.length; // TRUE se ha un elemento successivo, FALSE se non ce l'ha
}
} // CHIUSURA DELLA CLASSE INTERNA
public Iterator enumera(){ // Metodo che restituisce il riferimento ad un oggetto che implementa Iterator
return new MioIteratore(); // Ritorna il riferimento ad un oggetto di tipo MioIteratore appena creato
}
}
La collezione di stringhe viene banalmente rappresentata tramite un array di stringhe (il costruttore non l'ho scritto perchè tanto ai fini di questo argomento mi interessa poco ora come ora)
Poi voglio munirla di un iteratore per poterla scorrere comodamente in modo standard, allora ci ficco dentro una classe interna che ho chiamato MioIteratore che implementa l'interface Iterator e quindi implementa in modo coerente a com'è rappresentata la collezione tutti i metodi presenti dentro Iterator.
Fin quì tutto ok...
La domanda è la seguente....perchè poi fuori alla classe interna (quindi dentro la classe esterna) la proff ha dichiarato il metodo enumera che di fatto restituisce il riferimento ad un MioIteratore? Per comodità?
Ad esempio nel main se volevo iterare non funzionava comunque se creavo un nuovo oggetto di tipo MioIteratore a mano? Oppure non lo vedrei perchè è nella classe interna e quindi devo usare per forza il metodo enumera che è nella classe esterna che a sua volta può comunicare con la classe interna?
Spero di essere stato abbastanza chiaro...
Grazie
Andrea