Ho la seguente classe:La convalida dei campi sia nel costruttore che nel setter è considerata un codice ridondante errato?
public class Project {
private int id;
private String name;
public Project(int id, String name) {
if(name == null){
throw new NullPointerException("Name can't be null");
}
if(id == 0){
throw new IllegalArgumentException("id can't be zero");
}
this.name = name;
this.id = id;
}
private Project(){}
public int getId() {
return id;
}
public void setId(int id) {
if(id == 0){
throw new IllegalArgumentException("id can't be zero");
}
this.id = id;
}
public String getName()
return name;
}
public void setName(String name) {
if(name == null){
throw new NullPointerException("Name can't be null");
}
this.name = name;
}
}
Se avete notato che setName e setId condividono la stessa convalida per i suoi campi con il costruttore. È questo codice ridondante che potrebbe causare problemi in futuro (ad esempio se qualcuno modifica il setter per consentire 0 per l'id e prevenire -1 invece di cambiare il costruttore)? . Dovrei usare un metodo privato per fare il check e condividerlo tra il costruttore e il setter che sembra troppo se ci sono molti campi.
Nota: questo è il motivo per cui non utilizzo i setter nel costruttore. https://stackoverflow.com/a/4893604/302707
Utilizzare setter in CTORs se siete preoccupati. –
Oppure (nel caso in cui un setter non possa essere chiamato da Costruttore), passare la logica di convalida a un metodo privato condiviso. – SJuan76
che cosa è con il costruttore 'private' e la convalida nel getter? – mre