Chiamata reciproca di costruttori

Chiamata reciproca di costruttori

di Ragno Giovanni -
Numero di risposte: 2

Mi sono fermato a ragionare con più calma alla chiamata del costruttore che volevo realizzare stamattina e mi sono reso conto che volevo fare una cosa non possibile: la chiamata di un costruttore è un evento unico in un oggetto, per cui posso avere anche più di un costruttore disponibile ma uno solo potrà aessere eseguito e non è possibile che uno chiami l'altro.

L'obiettivo che mi ero prefisso si raggiunge facilmente scomponendo con un terzo metodo chiamato dal costruttore passando il parametro che interessa nel caso specifico.

Di seguito il codice  corretto:

    public CodaArray() {
        init(MAXLUNGHEZZA);
    }

    public CodaArray(int lung) {
        init(lung);
    }
    
    private void init(int lung) {
        dati=(T[])new Object[lung];
        inserimento=0;
        estrazione=0;
    }
    

 

In riposta a Ragno Giovanni

Re: Chiamata reciproca di costruttori

di Barreca Oscar -

Salve prof.

La chiamata reciproca ad un costruttore è possibile. L'ambiente che uso io è più aggiornato di quello usato in laboratorio, quindi temo ci siano delle incompatibilità.

Tuttavia, credo che il problema vero e proprio risieda nell'attributo final, che non può essere invocato prima del costruttore (in quanto viene passato come argomento a quest'ultimo). Non avendo il sorgente a disposizione (ne tantomeno la stessa versione dell'ambiente) non posso verificare correttamente, però potrebbe provare a rendere l'attributo MAXLUNGHEZZA static.

Ad ogni modo la chiamata reciproca di un costruttore è valida, e può provare liberamente di applicarla in un altro esempio.

Spero di essere stato d'aiuto!

EDIT:

Dimenticavo: la sintassi per richiamare il costruttore rimane quella che avevo proposto a lezione. Tanto per schiarire le idee, ecco questo: http://pastebin.com/vxV1HHhV.

In riposta a Barreca Oscar

Re: Chiamata reciproca di costruttori

di Ragno Giovanni -

Grazie per l'intervento, stavolta il ragno ha preso un granchio sorridente

effettivamente il problema stava nella definizione di MAXLUNGHEZZA

ecco dunque la versione corretta:

public class CodaArray<T> implements Coda<T> {
    private T[] dati;
    private Integer estrazione;//indice dove estrarre il prossimo dato
    private Integer inserimento;//indice dove inserire il prossimo dato
    private static final int MAXLUNGHEZZA=100;

    public CodaArray() {
        this(MAXLUNGHEZZA);
    }

    public CodaArray(int lung) {
        dati=(T[])new Object[lung];
        inserimento=0;
        estrazione=0;
    }
...

Metto anche un link ad una pagina di documentazione in cui si cita esplicitamente la chiamata del costruttore con this e un secondo link ad un'altra pagina in cui viene indicata la sequenza dei passi al momento dell'istanza di un oggetto in cui si legge (nellelenco numerato da 1 a 5) che la chiamata del costruttore dentro al costruttore (quindi come in this(MAXLUNGHEZZA);) viene fatta prima di dare valore agli attributi (nel nostro caso private final int MAXLUNGHEZZA=100;), il fatto di dichiarare private static final int MAXLUNGHEZZA=100; ne dà valore invece in compile-time e quindi è pienamente disponibile al momento dell'istanza.