Oppure

Loading
07/02/10 0:18
M.A.S
Salve,

vorrei un chiarimento sull'uso di this nel ciclo foreach che segue:

class VectorDiStringhe extends Vector<String>{

    public int numeroDiStringheNull(){
     int k=0;
     for(String s:this){
     if(s==null)
     k++;
     }        
    return k;    
    }
}

Di solito this è riferimento dell'oggetto in esecuzione e lo vedo sempre seguito dal nome
di un metodo o di un campo.
In questo caso è da solo nel ciclo foreach e in una posizione solitamente occupata da
riferimenti ad array o oggetti simili.
Ora è vero che la mia classe estende Vector che contiene un array (e presumo che this punti a quello) ma non capisco come this possa, senza ulteriori descrizioni, puntare a
un campo particolare quando lo stesso oggetto potrebbe averne più di uno. Mi pare una
soluzione ambigua, eppur funziona....
Mi sapete dire dove sbaglio?

Grazie in anticipo, saluti.

aaa
07/02/10 14:53
netarrow
il foreach funziona sugli oggetti che supportino gli iteratori, essendo this riferito a una classe che estende un Vector funziona.

IL foreach in realtà viene sostituite a compile-time con un for classico di questo tipo:

for (Iterator<MyClass> i = miaCollezione.iterator(); miaCollezione.hasNext(); )
        MyClass oggetto = i.next();


dove miooggetto è una classe iterabile come il tuo vettore.

Quindi se tu gli passi this o altri oggetti adatti lui sa che dovrà richiamare su quella istanza i metodi iterator, hasNext e next, metodi forniti dalla super classe.
aaa
07/02/10 20:26
M.A.S
Anzitutto grazie per la celere risposta.

Quindi se ho capito bene accade che:
    this non ha funzioni aggiuntive strane e, al solito, è riferimento all' oggetto
    che esegue.
    A consentire l'esplorazione dei dati contenuti in questo oggetto è il fatto che
    esso implementa l'interfaccia iterable e che il suo riferimento è usato dentro
    al foreach (che viene compilato nel modo che mi hai esposto).

    Dunque siamo ad un livello più astratto dell'andare a leggere il campo array
ereditato da una superclasse in maniera diretta. Praticamente questa operazione di
lettura    avviene grazie diversi e celati passaggi e a noi basta indicare il nostro
oggetto    vector (un contenitore) con il this dentro al foreach.

Spero di aver inteso bene, mi sembra che torni tutto. Confermi?
Grazie ancora e ciao.
aaa
11/02/10 9:47
netarrow
per chiarire bene chi è this, guarda questo:

Classe oggetto = new Classe();
oggetto.metodo(parametro);


quando tu nel corpo di un metodo usi this, è come usare oggetto. Così ti eviti di dover fare:

oggetto.metodo(oggetto, parametro);


che sarebbe il modo da usare quando non è intrinseco l'accesso a chi ha chiamato il metodo o in generale mandato un messaggio (nella gestione degli eventi c'è un parametro sender o chiamato anche source se hai mai visto)

Quindi che li ci sia this o una qualsiasi altra istanza di una classe non cambia nulla è solo una questione di forma.

Per quanto riguarda poi la riuscita dell'operazione si basa sul polimorfismo, immagina un metodo come questo:

void metodo(InterfacciaAstratta ia) {
ia.metodoAstratto()
}


tu li potrai ovviamente passargli qualsiasi oggetto che implementi InterfacciaAstratta e lui chiamerà la versione del metodo implementata dalla classe, nel nostro caso indipendentemente che sia un Vector, List o simili.

Quando è poi un array primitivo ora non saprei che fa un qualche boxing per convertirlo in qualche altro tipo di dato o semplicemente a compile-time genera invece che un codice basato sugli iteratori, basato sul semplice scorrimento degli indici per tutta la dimensione del array; sarei però più per la seconda.

Quindi non c'è niente di nascosto, di celato o misterioso in realtà, è solo più corto da scrivere rispetto un classico for dove gli devi dire tu sempre le stesse cose, cioè da dove parti, fino a quanto vai a vanti e di quanto in quanto.
aaa
14/02/10 7:53
M.A.S
:k:
ancora grazie per le info e saluti, ciao.
aaa