Quando si inizia a programmare in java, molto presto ci si imbatterà nella parola chiave this. In java questa parola ha un significato ed una serie di funzioni specifiche. Se vi state interrogando sul della parola chiave this java siete nel posto giusto, continuate a leggere e lo scopriremo insieme!
Indice
- Cos’è this in java?
- Usare this riferito ad un attributo
- Utilizzo di this con un costruttore
- Conclusioni
Cos’è this in java?
Generalmente possiamo trovare la parola chiave this in un metodo d’istanza o in un costruttore. In queste due situazioni this indica un riferimento esplicito all’oggetto corrente, ovvero l’oggetto di cui fanno parte il metodo o il costruttore. Possiamo quindi utilizzare tutti i campi dell’oggetto corrente all’interno di un metodo d’istanza o un costruttore utilizzando la parola chiave this.
L’utilizzo di this è particolarmente utile nei casi in cui potrebbe esserci ambiguità con altri parametri del metodo. Chiariremo meglio questa affermazione negli esempi più avanti.
Usare this riferito ad un attributo
Il motivo più comune per utilizzare la parola chiave this è quella del caso in cui un attributo della classe sia oscurato (shadowed) da un parametro del metodo o costruttore.
And esempio, ipotizziamo di avere la classe Rettangolo con due attributi larghezza e altezza:
A questo punto decido di aggiungere un costruttore che abbia come argomenti i valori desiderati per entrambi gli attributi larghezza e altezza. Potrò scrivere la classe in questo modo:
package it.informaticappunti;
public class Rettangolo {
private int larghezza;
private int altezza;
public Rettangolo(int larghezza2, int altezza2) {
larghezza = larghezza2;
altezza = altezza2;
}
}
In questo modo, chiamando gli argomenti del costruttore larghezza2
e altezza2
non ci sono ambiguità. Questo però limiterà la leggibilità del codice, il 2 potrebbe confonderci nella manutenzione e potrebbe confondere ch utilizzerà il costruttore dall’esterno che leggerà un campo che si chiama larghezza2
senza però vedere da nessuna parte un campo larghezza e si chiederà il perché di quel 2.
Utilizzando la parola chiave this possiamo riscrivere il costruttore in maniera più leggibile, manutenibile e chiara da parte di chi lo utilizzerà dall’esterno senza doversi occupare di conoscere la struttura interna della classe. Proviamo a vedere come questa parola chiave può risolverci tutti i problemi e perché è necessario utilizzarla:
package it.informaticappunti;
public class Rettangolo {
private int larghezza;
private int altezza;
public Rettangolo(int larghezza, int altezza) {
this.larghezza = larghezza;
this.altezza = altezza;
}
}
In questo caso abbiamo chiamato i campi del costruttore larghezza
e altezza
. In questo modo chi utilizzerà il costruttore dall’esterno capirà immediatamente che i due parametri da passare sono la larghezza e l’altezza del rettangolo da costruire.
Questo però ci porta ad avere un’ambiguità all’interno del costruttore. Scrivendo solamente larghezza all’interno del costruttore ci sarebbe un’ambiguità fra la variabile parametro del costruttore e il campo della classe Rettangolo. In questo caso si parla di shadowing, dal termine inglese shadow (ombra), ovvero in maniera predefinita l’ambiguità viene risolta prendendo il parametro del costruttore che quindi oscura l’accesso al campo della classe Rettangolo. Per ovviare a questo inconveniente possiamo utilizzare this.larghezza
e this.altezza
ogni volta che vogliamo riferirci al campo della classe. In questo caso quindi la parola chiave this serve ad indicare che l’argomento che segue è da ricercare nella classe e non fra le variabili definite all’interno del costruttore.
Questa pratica si trova spesso utilizzata anche all’interno dei metodi setter. Se volessimo introdurre un metodo per cambiare l’altezza del rettangolo potremmo farlo utilizzando un setter con la parola chiave this in questo modo:
Anche in questo caso utilizzeremo altezza
per riferirci al parametro del metodo setAltezza
e this.altezza
per riferirci all’attributo della classe Rettangolo.
Utilizzo di this con un costruttore
Quando siamo all’interno di un costruttore è possibile utilizzare la parola chiave this per invocare un altro costruttore all’interno della stessa classe. Avremo quindi una chiamata esplicita al costruttore. Questa pratica è particolarmente utile quando abbiamo diversi costruttori con diversi set di parametri e vogliamo che quelli con meno parametri richiamino il costruttore con più parametri utilizzando dei valori di default per i campi mancanti. Questa pratica è più facile da vedere con un esempio che da spiegare. Vediamo quindi un altro esempio della classe rettangolo per fare maggiore chiarezza.
package it.informaticappunti;
public class Rettangolo {
private int x;
private int y;
private int larghezza;
private int altezza;
public Rettangolo(int larghezza, int altezza) {
this(0, 0, larghezza, altezza);
}
public Rettangolo(int x, int y, int larghezza, int altezza) {
this.x = x;
this.y = y;
this.larghezza = larghezza;
this.altezza = altezza;
}
}
Abbiamo aggiunto ai due campi dell’esempio precedente, altri due campi x e y, che rappresenteranno la posizione del rettangolo in un sistema cartesiano.
Per il costruttore con tutti gli argomenti abbiamo utilizzato la parola chiave this nello stesso modo in cui l’abbiamo utilizzata nell’esempio precedente. Per il costruttore con solo larghezza e altezza abbiamo utilizzato this in un modo differente. Sembrerebbe quasi che abbiamo richiamato un metodo da qualche parte chiamato this, con 4 argomenti. In realtà in questo caso la parola chiave this ha la funzione di richiamare un costruttore della classe. Il codice del primo costruttore (a due argomenti) non farà quindi altro che chiamare il secondo costruttore (a quattro argomenti) impostando dei valori di default (in questo caso 0) per i parametri mancanti.
Questa pratica permette di evitare duplicazione del codice, rendere tutto più compatto e leggibile. Potremmo infatti aver scritto lo stesso codice come nell’immagine seguente ma sarebbe stato decisamente meno leggibile, manutenibile e più prolisso senza nessun beneficio ulteriore.
L’unico vincolo che abbiamo nell’uso di this per richiamare un costruttore è che, se questa istruzione è presente, deve essere nella prima riga del costruttore. Non potremo quindi eseguire alcuna istruzione all’interno di un costruttore prima di chiamare un altro costruttore. Questo non ci permetterà quindi di scrivere il primo costruttore nella forma:
public Rettangolo(int larghezza, int altezza) {
int x = 0;
int y = 0;
this(x, y, larghezza, altezza);
}
Oltre ad avere poca utilità nel caso specifico, riceveremo un errore dal compilatore del tipo
Error:(12, 13) java: call to this must be first statement in constructor
Conclusioni
Con questa panoramica sulla parola chiave this java dovremmo aver chiarito un po’ tutti i dubbi che chi si appresta ad imparare il linguaggio java potrebbe avere. Abbiamo visto come utilizzare this per risolvere il problema di ambiguità fra i parametri di un metodo/costruttore e gli attributi della classe. Abbiamo poi chiarito come utilizzare la parola chiave this in un costruttore per richiamare un altro costruttore all’interno della stessa classe java.
Se avete ulteriori dubbi non esitate a lasciare un commento.