PDA

View Full Version : [Java] Uso di eccezioni nei costruttori e metodi get/set


Johnn
04-07-2008, 22:24
Poniamo che una classe A abbia un costruttore nel quale un'istruzione può sollevare un'eccezione magari perché un parametro passato in input per essere assegnato ad una variabile ha un valore non valido.

1) Immagino che sia meglio gestire l'eccezione direttamente all'interno del costruttore, giusto (nel codice seguente si deve inserire un blocco try catch)?


class A {
private int n;

public A(int n){
if(n<0)
throw new MyException();
else
this.n = n;
}
}


2) E' meglio usare un eventuale metodo setN nel costruttore invece del codice postato sopra?
2a) Nel caso affermativo, l'eccezione verrebbe sollevata dal metodo getN e nel costruttore dovrebbe essere solo gestita, giusto?

3) Ma è buona norma usare sempre e comunque i metodi get e set all'interno dei metodi di una classe per accedere agli attributi della stessa, anche nel caso non debbano essere fatti controlli su di essi? Non si avrebbero inutili cali di prestazioni (frequenti chiamate a funzione solo per accedere ad attributi della classe)?

Grazie.

demos88
05-07-2008, 14:33
in simili casi credo sia più una scelta di stile. Se la tua applicazione o classe non dovrà essere sviluppata oltre e quindi non prevede altre funzioni, potrebbe anche stare così. Però io personalmente preferisco definire dei metodi di get e set per le variabili che possono necessitare di modifica in fase di esecuzione. Se poi dovrai sviluppare l'applicazione ti può tornare molto utile l'avere disponibili già dei metodi intuitivi per quella variabile.
La mia filosofia, che credo sia quella generale delle classi, è la possibilità di essere riutilizzate nei più disparati ambiti, e funzioni di setting e getting permettono una migliore "interattività" dell'oggetto.
Il calo di prestazioni è praticamente nullo in questo caso.

Mixmar
05-07-2008, 15:28
Aggiungo un'altra cosa alle osservazioni di demos88 che sostanzialmente condivido: se per caso la tua classe dovesse diventare un bean, sarebbe opportuno gestire le eccezioni all'interno dei getter e setter anzichè all'interno del costruttore con i parametri.

Questo perchè una classe bean viene tipicamente istanziata tramite la Reflection, cioè utilizzando il metodo "newInstance" che invoca il costruttore vuoto della classe, e poi invoca i setter di tutti i campi dichiarati: quindi significa che eventuali controlli effettuati nel / nei costruttore / i con parametri sarebbero di fatto ignorati in questo caso.

Johnn
07-07-2008, 19:19
Ok, grazie ancora.