Corso di Java

Metodi e costruttori III

 

Abbiamo accennato più volte ad uno speciale metodo che può essere contenuto nelle classi Java, noto col nome di costruttore: oggi vedremo cos’è, a cosa serve e come sfruttarlo al meglio per i nostri scopi.
Innanzitutto occorre sapere che il costruttore è un metodo che viene richiamato automaticamente da Java su un oggetto, quando questo viene creato, e non può essere invocato direttamente come un metodo normale.
Nella scorsa lezione abbiamo visto che l’ultima cosa che fa l’operatore new, quando si crea una nuova istanza di una classe, è proprio quella di richiamare il costruttore della classe; tuttavia non è obbligatorio che ogni classe definisca metodi costruttori: se questi sono assenti, l’istruzione new su quella classe va comunque a buon fine e l’oggetto viene generato.
L’importanza dei metodi costruttori consiste nel fatto che, tramite essi, è possibile impostare i valori iniziali degli attributi, richiamare determinati metodi in funzione di tali valori, richiamare metodi di altri oggetti e impostare le proprietà iniziali dell’oggetto.
Le differenze principali tra costruttori e metodi normali sono due:
i costruttori hanno sempre lo stesso nome della classe;
i costruttori non restituiscono mai un valore.

Per definire un costruttore occorre semplicemente indicare il nome della classe e la lista degli eventuali argomenti; ad es. nel caso della classe “Automobile” potremmo così definirlo:

Automobile(String mrc, String mdl, float capSerb, float livRis, float cns,
           float qBenz, boolean ar, boolean af) {
    marca = mrc;
    modello = mdl;
    capacitaSerbatoio = capSerb;
    livelloRiserva = livRis;
    consumo = cns;
    quantitaBenzina = qBenz;
    autoradio = ar;
    antifurto = af;
    }


Questo costruttore ha otto argomenti, che rappresentano rispettivamente: la marca dell’automobile, il modello, la capacità del serbatoio, il livello della riserva, il consumo, la quantità di benzina nel serbatoio, la presenza dell’autoradio e la presenza dell’antifurto.

Con questo costruttore, per istanziare un oggetto di tipo Automobile occorre utilizzare la seguente istruzione:

Automobile auto = new Automobile(“Fiat”, “500”, 40, 5, 17, 30, true, false);


Con essa viene creato un oggetto di tipo Automobile di marca Fiat, modello 500, con serbatoio da 40 litri, livello di riserva da 5 litri, in grado di percorrere 17 km con un litro, avente 30 litri di benzina nel serbatoio, dotata di autoradio, ma sprovvista di antifurto.
Notiamo che nel corpo del costruttore vengono effettuati degli assegnamenti agli attributi capacitaSerbatoio, livelloRiserva e consumo, che sono stati dichiarati final, cioè come valori costanti (v. lez. 6): il costruttore è infatti l’unico luogo in cui ciò è possibile; al di fuori di esso ogni assegnamento di questo tipo produrrà, in fase di compilazione, l’errore “Can't assign a second value to a blank final variable” seguito dal nome della costante che si è cercato di modificare.
Non solo: l’inizializzazione di valori costanti è obbligatoria.
Infatti se si omette di inizializzare il valore di una variabile la compilazione del codice sorgente va a buon fine, mentre il compilatore produrrà un errore per ogni variabile final non inizializzata.

Se ad es. dimenticassimo di inizializzare il valore di capacitaSerbatoio, otterremmo l’errore:

Blank final variable 'capacitaSerbatoio' may not have been initialized. It must be assigned a value in an initializer, or in every constructor

In ogni caso, è opportuno che il programmatore si occupi di inizializzare opportunamente TUTTI gli attributi della classe, al fine di evitare comportamenti erronei degli oggetti.
Per ogni classe Java è possibile specificare più di un costruttore, purché ognuno di essi abbia una serie di argomenti diversa per numero e tipo.
In realtà Java permette, più in generale, di definire metodi con lo stesso nome, ma diversi per segnatura.
Per segnatura di un metodo si intende il numero degli argomenti e il tipo di dati o gli oggetti di ciascun argomento.
Ad es. potremmo stabilire dei valori di default per alcune variabili, che consentano di utilizzare un costruttore più compatto.
Vedremo come sfruttare questa opportunità nella prossima puntata.

 

Torna all'indice Generale del corso di Corso di Java di Software Planet