La parola chiave this in Java

Concetti Chiave
  • La parola chiave this in Java è un riferimento all'oggetto corrente su cui è stato invocato un metodo.
  • this può essere utilizzata per risolvere conflitti di nomi tra variabili locali e variabili di istanza.

La parola chiave this

A volte un metodo ha bisogno di fare riferimento all'oggetto che lo ha invocato. Per consentire ciò, Java definisce la parola chiave this.

this può essere usata all'interno di qualsiasi metodo per fare riferimento all'oggetto corrente. Cioè, this è sempre un riferimento all'oggetto su cui è stato invocato il metodo. Si può usare this ovunque sia permesso un riferimento a un oggetto del tipo della classe corrente.

Per comprendere meglio a cosa si riferisce this, si consideri la seguente versione di Scatola():

// Un uso ridondante di this.
Scatola(double l, double a, double p) {
    this.larghezza = l;
    this.altezza = a;
    this.profondita = p;
}

Questa versione di Scatola() funziona esattamente come la versione precedente.

L'uso di this è ridondante, ma perfettamente corretto. All'interno di Scatola(), this si riferisce sempre all'oggetto che invoca. Sebbene sia ridondante in questo caso, this è utile in altri contesti, uno dei quali è spiegato nella prossima sezione.

Mascheramento delle Variabili di Istanza

Come è noto, in Java è illegale dichiarare due variabili locali con lo stesso nome all'interno dello stesso ambito o in ambiti annidati.

Curiosamente, si possono avere variabili locali, inclusi parametri formali dei metodi, che si sovrappongono ai nomi delle variabili di istanza della classe. Tuttavia, quando una variabile locale ha lo stesso nome di una variabile di istanza, la variabile locale nasconde la variabile di istanza.

È per questo che larghezza, altezza e profondita non sono stati usati come nomi dei parametri nel costruttore Scatola() all'interno della classe Scatola. Se lo fossero stati, allora larghezza, ad esempio, si sarebbe riferita al parametro formale, nascondendo la variabile di istanza larghezza.

Anche se di solito è più facile semplicemente usare nomi diversi, esiste un altro modo per aggirare questa situazione. Poiché this consente di fare riferimento diretto all'oggetto, lo si può usare per risolvere eventuali conflitti di spazio dei nomi tra variabili di istanza e variabili locali. Ad esempio, ecco un'altra versione di Scatola(), che usa larghezza, altezza e profondita come nomi dei parametri e poi usa this per accedere alle variabili di istanza con lo stesso nome:

// Usare this per risolvere conflitti di spazio dei nomi.
Scatola(double larghezza, double altezza, double profondita) {
    this.larghezza = larghezza;
    this.altezza = altezza;
    this.profondita = profondita;
}
Nota

Attenzione al mascheramento delle variabili

L'uso di this in un contesto del genere può essere fonte di confusione, e alcuni programmatori preferiscono non usare variabili locali e parametri formali che nascondano le variabili di istanza.

Naturalmente, altri programmatori sostengono il contrario — che è una buona convenzione usare gli stessi nomi per chiarezza, e usare this per distinguere la variabile di istanza.

Si tratta, in ogni caso, di una questione di stile.