A questo punto della guida abbiamo dato gli strumenti essenziali al lettore per poter scrivere delle applicazioni di elementare complessità. Torniamo adesso ad accuparci della programmazione ad oggetti definendo il concetto di metodo costruttore.
Un costruttore di una classe, prima di tutto, viene definito con lo stesso nome della classe e una caratteristica che lo differenzia da un normale metodo è il fatto di non avere un tipo di ritorno. Il metodo costruttore viene chiamo, solo ed esclusivamente, quando viene istanziata la classe, quindi si accede al costruttore una sola volta per ogni istanza della classe. Vediamo adesso un esempio chiarificatore per quanto riguarda la costruzione di un costruttore rifacendosi alla classe di esempio "OperazioniSuNumeri":
public class OperazioniSuNumeri {
//costruttore
public OperazioniSuNumeri {
System.out.println("Ho istanziato una classe OperazioniSuNumeri);
}
public int sottrazione (int x, int y) {
//sottrazione
}
public String comparazione (int x, int y) {
//comparazione
}
}
Come si vede nel codice di esempio il costruttore scritto rispecchia le caratteristiche sopra elencate ovvero non ha nessun tipo di ritorno ed ha lo stesso nome della classe.Quando istanzieremo la classe "OperazioniSuNumeri" con il seguente codice:
OperazioniSuNumeri numero;
numero = new OperazioniSuNumeri();
di fatto chiameremo in maniera automatica il costruttore della classe e quindi avremo, come output, la seguente stampa a video
Ho istanziato una classe OperazioniSuNumeri
Nel nostro esempio abbiamo inserito il costruttore della classe come primo metodo, ma ciò non è rilevante in quanto al momento della creazione dell’istanza dell’oggetto in automatico verrà richiamto il costruttore anche se è l’ultimo metodo inserito nella classe. Da ciò si deduce che il Java non analizza le classi in maniera sequenziale. E’ buona norma comunque strutturare la classe seguendo la lista sottostante:
- Le variabili di istanze ed eventuali costanti
- Il costruttore
- Tutti gli altri metodi della classe
Precisiamo che nelle lezioni precedenti istanziavamo oggetti senza che nella classe fosse presente un costruttore. Commettevamo un errore? Assolutamente no, il Java ha la particolarità che all’atto di compilazione se non è presente un costruttore all’interno della classe viene aggiunto automaticamente un costruttore di default che consentirà di istanziare l’oggetto in maniera corretta ma non compirà nessuna operazione dato che il corpo del metodo di costruttore di default è vuoto.
A questo punto potrebbe sorgere spontanea la domanda: ma, all’atto pratico, a cosa serve il metodo costruttore? Ipotizziamo di avere la nostra classe "OperazioniSuNumeri" che oltre ai metodi scritti negli esempi precedenti implementi la somma, la moltiplicazione, la divisione e molte altre funzionalità. Fino a questo momento, senza il costruttore, passavamo, sia per il metodo "sottrazione" che per il metodo "comparazione", i valori al momento della chiamata del metodo. Nel caso volessimo effettuare un’analisi completa su due numeri (quindi richiamando per esempio un metodo per la somma, il prodotto, la sottrazione, la divisione e la comparazione) senza il costruttore creeremo per ogni chiamata a funzione due variabili per immagazzinare i valori dei numeri "x" e "y" e quindi, in totale, verrebbero allocate dieci variabili con contenuto identico per poter chiamare le cinque funzioni. Utilizzando il metodo costruttore sarà possibile allocare le due variabili una sola volta e i vari metodi chiamati leggeranno semplicemente il contenuto delle variabili d’istanza senza costruirne una copia. Vediamo dunque il codice di esempio:
public class OperazioniSuNumeri {
public numeroX;
public numeroY;
public OperazioniSuNumeri(int x, int y) {
numeroX=x;
numeroY=y;
}
public int sottrazione() {
int sottrazione;
sottrazione=numeroX-numeroY;
return sottrazione;
}
public int somma() {
int somma;
somma=numeroX+numeroY;
return somma;
}
// gli altri metodi con la stessa struttura
}
E il codice per istanziare l’oggetto e la chiamata dei metodi cambierà nel modo seguente:
public class Implementazione {
public static void Main(String args[]) {
//Istanza della classe OperazionisuNumeri
OperazioniSuNumeri operazioni;
operazioni = new OperazioniSuNumeri(10,2);
int sottrazione = operazioni.sottrazione(); //richiamo il metodo sottrazione
int somma = operazioni.somma(); //richiamo il metodo somma
//stampo a video i risultati ottenuti
System.out.println(somma);
System.out.println(sottrazione);
}
}