La pratica standard è di convalidare gli argomenti nel costruttore. Per esempio:
class Range {
private final int low, high;
Range(int low, int high) {
if (low > high) throw new IllegalArgumentException("low can't be greater than high");
this.low = low;
this.high = high;
}
}
Nota a margine: per verificare che gli argomenti non sono nulli, che è abbastanza comune, è possibile utilizzare:
import static java.util.Objects.requireNonNull;
Constructor(Object o) {
this.o = requireNonNull(o); //throws a NullPointerException if 'o' is null
}
UPDATE
Per rispondere alla tua specifica commento sul numero di previdenza sociale. Un modo potrebbe essere quello di aggiungere un metodo alla classe:
//constructor
public YourClass(String ssn) {
if (!isValidSSN(ssn)) throw new IllegalArgumentException("not a valid SSN: " + ssn);
this.ssn = ssn;
}
public static boolean isValidSSN(String ssn) {
//do some validation logic
}
Il codice chiamante potrebbe allora apparire come:
String ssn = getSsnFromUser();
while(!YourClass.isValidSSN(ssn)) {
showErrorMessage("Not a valid ssn: " + ssn);
ssn = getSsnFromUser();
}
//at this point, the SSN is valid:
YourClass yc = new YourClass(ssn);
Con questo disegno, avete raggiunto due cose:
- tu convalidi l'input dell'utente prima di usarlo (cosa che dovresti sempre fare - gli utenti sono molto bravi negli errori di battitura)
- ti sei assicurato che se
YourClass
è m isused viene generata un'eccezione e vi aiuterà a individuare i bug
Si potrebbe andare oltre creando una classe SSN
che contiene lo SSN e incapsula la logica di convalida. YourClass
accetta quindi un oggetto SSN
come argomento che è sempre un SSN valido per costruzione.
L'argomento illegale, come lei e altri hanno detto, avrebbe rotto il programma, giusto? –
@TiagoSirious Cosa intendi per "pausa"? Uscirà immediatamente dal costruttore e genererà un'eccezione al chiamante. E lo vuoi perché hai ricevuto argomenti che non sai cosa fare con ... Quindi questo ti aiuterà a identificare un bug nel codice che chiama questo costruttore. – assylias
Ok, ma immagina che l'utente superi un numero di previdenza sociale che non è valido. Lo voglio controllato, ma non voglio che l'applicazione smetta di funzionare. Voglio avvertire l'utente che questo SSN non è valido e voglio che reinserisca un SSN valido. In questo caso, se lancio l'eccezione, è solo il costruttore che esce o l'intera applicazione? Aggiornamento –