2016-05-07 12 views
5

Per essere più specifici, voglio scrivere un codice che genera IllegalArgumentException se il valore dato è negativo. Dovrei includere questo codice all'interno di setter/costruttore o dovrei controllare il valore quando viene chiamato il metodo appropriato? (Ad esempio:.. start(), init(), print() o run() qualsiasi altra cosa)È buona pratica lanciare l'eccezione all'interno dei setter in Java?

Il mio codice (semplificato):

public class LLUAlgorithm { 

private int temperature; 

public int getTemperature() { 
    return temperature; 
} 

public void setTemperature(int temperature) { 
    if (temperature < 0) 
     throw new IllegalArgumentException("can't be smaller than 0.") 
    this.temperature = temperature; 
} 

public void run() { 
    ... 
} 

non ricordo un solo caso che un setter genera un'eccezione come sopra. Ma sono curioso di sapere se è buono/cattivo.

+3

Bene, il nome dell'eccezione contiene _illegal argument_, quindi ovviamente è possibile lanciarlo, quando un argomento era illegale, come un numero negativo. E sì, questo può accadere in un setter e non ho mai sentito dire che questa sarebbe una cattiva pratica (perché non lo è). – Tom

+1

sì, è ok, si potrebbe anche provare a essere più specifici con l'eccezione ... se è nullo, se è indice non valido o definire l'eccezione personalizzata –

+2

Si dovrebbe lanciare IllegalArgumentException. Puoi esagerare con un modello di builder. Hai letto il libro "Efficace Java", che ha materiale sul modello di builder. –

risposta

4

L'approccio migliore è rendere il tuo oggetto immutabile, sbarazzarsi dei tuoi setter e lanciare la tua eccezione nel costruttore altrimenti qualunque sia il modo scelto, in caso di errore, hai un alto rischio di avere il tuo oggetto in uno stato incoerente che causerà un bug difficile da trovare. Per una migliore comprensione, leggere this in particolare la sezione relativa a Failure Atomicity.

+0

Quindi ho capito. Se rimuovo il setter nel mio caso e inserisco l'eccezione nel costruttore, l'oggetto non verrà nemmeno creato. Altrimenti, l'oggetto si troverà in uno stato non funzionante. Grazie mille, sia per la risposta che per il link. – leventunver

Problemi correlati