Newsgroup: it.comp.java
Titolo: Strano comportamento con costruttori

Salve ragazzi. Avrei una domanda per voi, perché io proprio non trovo
spiegazione.
Ho scritto una classe all'interno di un'altra che realizza una
interfaccia (Comparator). Tale classe è privata. Poi ho scritto un
costruttore per la classe esterna, ed all'interno creo un oggetto
esemplare di questa classe interna. Volevo fare in modo che l'utente
della classe avesse due scelte, o passare alla mia classe un oggetto di
tipo Comparator proprio scritto da lui, oppure usare quello standard
offerto dalla mia classe interna. Allora ho scritto così:
public ClasseEsterna() {new ClasseEsternal(new ClasseInterna());}
public ClasseEsterna(Comparator c)
{
 this.c = c;
 // varia altra roba
}
però sembra che il programma funzioni in modo diverso a seconda che io
chiami da un metodo main di prova all'interno di classeesterna:
ClasseEsterna c = new ClasseEsterna();
e
ClasseEsterna c = new ClasseEsterna(new ClasseInterna());
cioè, proprio cambia tutto, difatti in un caso (il secondo) tutto
funziona, mentre nel primo mi da subito delle eccezioni di tipo
nullpointerExcpetion che sinceramente non so a cosa siano dovute.
Secondo voi come mai?
Grazie mille e ciao a tutti.
Luca

 
mi sembra normale che si comporti in modo diverso, usando:
public ClasseEsterna() {new ClasseEsternal(new ClasseInterna());}
crei una nuova ClasseEsterna ("new ClasseEsterna(..)") che nel 
costruttore "ClasseEsterna(Comparator c)" non crei (prova a mettere 
delle stampe per vedere quante volte e come vengono richiamati i 
costruttori).
Puoi dichiarare il 1mo costruttore come:
public ClasseEsterna() {
       this.c = new ClasseInterna();
}

 }
In effetti qualche dubbio mi viene, eppure mi pareva che un sistema del
genere lo avessi già visto altrove. Peraltro l'ho usato anche in altri
casi e negli altri sembra funzionare.
Mah, non saprei, evidentemente mi sono sbagliato. Userò la soluzione che
mi hai consigliato.
Grazie mille.
Luca

 }
con il primo costruttore non inizializzi this.c da cui le
NullPointerException. 
Il costruttore non è un metodo, non stai facendo
return new ClassEsterna(ecc..) infatti il return non c'è.
Nel corpo del costruttore sei già nel nuovo oggetto, devi inizializzarne le
variabili. Tu crei una nuova ClasseEsterna che non viene assegnata a niente
lasciando le variabili dell'oggetto appena costruito a null. 
quello che volevi fare tu probabilmente è 
this(new ClasseInterna());
che passa il controllo all'altro costruttore. Però in questo caso non si
puo' fare. Il costruttore della superclasse deve essere la prima cosa
invocata in un costruttore. Se non lo metti è implicito (la super classe
deve avere un costruttore senza parametri).
se scrivi:
public ClasseEsterna() {
 this(new ClasseInterna());
}
 public ClasseEsterna(Comparator c) {
 //super();  implicito
 this.c = c;
}
new ClasseInterna() deve essere invocato prima di super() ed il compilatore
si lamenta.
sarebbe ad esempio possibile
public ClasseEsterna() {
 this(null);
}
ma inutile nel tuo caso. ( a meno che nel secondo costruttore con argomento
null usi la classe interna di default).
In definitiva la cosa più facile è 
this.c = new ClasseInterna() 
Ciao
--
chi sono e soprattutto chi non sono:
http://www.softeaware.it

 this.c = new ClasseInterna()
Perfetto, grazie mille per la chiarezza. Ora ho capito tutto ed ho
risolto ottimamente.
Grazie mille.
Luca