Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Strano uso di THIS
Forum - Java - Strano uso di THIS

Avatar
M.A.S (Normal User)
Newbie


Messaggi: 3
Iscritto: 07/02/2010

Segnala al moderatore
Postato alle 1:18
Domenica, 07/02/2010
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.


PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 15:53
Domenica, 07/02/2010
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:

Codice sorgente - presumibilmente Java

  1. for (Iterator<MyClass> i = miaCollezione.iterator(); miaCollezione.hasNext(); )
  2.         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.

PM Quote
Avatar
M.A.S (Normal User)
Newbie


Messaggi: 3
Iscritto: 07/02/2010

Segnala al moderatore
Postato alle 21:26
Domenica, 07/02/2010
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.

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 10:47
Giovedì, 11/02/2010
per chiarire bene chi è this, guarda questo:

Codice sorgente - presumibilmente Java

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



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

Codice sorgente - presumibilmente Plain Text

  1. 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:

Codice sorgente - presumibilmente Java

  1. void metodo(InterfacciaAstratta ia) {
  2. ia.metodoAstratto()
  3. }



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.

PM Quote
Avatar
M.A.S (Normal User)
Newbie


Messaggi: 3
Iscritto: 07/02/2010

Segnala al moderatore
Postato alle 8:53
Domenica, 14/02/2010
:k:
ancora grazie  per le info e saluti, ciao.

PM Quote