Convalida costruttore e setter

2

Ho la seguente classe:

public class Project {

    private int id;
    private String name;  

    public Project(int id, String name, Date creationDate, int fps, List<String> frames) {
        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) { 
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Ho tre domande:

  1. Uso i setter di classe invece di impostare direttamente i campi. Uno dei motivi per cui l'ho impostato direttamente è che nel codice i setter non sono definitivi e potrebbero essere ignorati.

  2. Se il modo giusto è impostarlo direttamente e voglio assicurarmi che il nome archiviato non sia nullo sempre. Dovrei fornire due assegni, uno nel costruttore e uno nel setter.

  3. Ho letto in java efficace che dovrei usare NullPointerException per i parametri null. Dovrei usare IllegalArgumentException per altri controlli, come l'id nell'esempio.

posta Jimmy 01.09.2012 - 16:24
fonte

2 risposte

2

La tua classe consente a qualcuno di dire myProject.setName (null), evitando il controllo null nel costruttore. Se vuoi impostare cose attraverso il costruttore ma hai bisogno di controlli (domanda 2), ti suggerisco di eseguire i controlli nei metodi set e chiamarli dal costruttore. Esempio:

public class Project {

    private int id;
    private String name;  

    public Project(int id, String name, Date creationDate, int fps, List<String> frames) {
        setName(name);
        setId(id);
    }

    public void setId(int id) { 
        if(id == 0 ){
            throw new IllegalArgumentException("id can't be zero");
        }
        this.id = id;
    }

    public void setName(String name) {
        if(name == null ){
            throw new NullPointerException("Name can't be null");
        }
        this.name = name;
    }

}

Questo evita la duplicazione del codice.

    
risposta data 01.09.2012 - 17:21
fonte
0

Credo che non si dovrebbe ottenere qualcosa in più nei getter e setter. Ci sarà tempo in futuro in cui mettere funzionalità aggiuntive in getter e setter causerà strani effetti collaterali.

Ma la ragione più convincente è quando si usa la classe come entità dati, quei getter e setter potrebbero essere usati dal contenitore java bean (EJB, Spring), JPA, marshaller XML e unmarshaller.

Preferisco anche usare IllegalArgumentException su NPE. Se hai intenzione di prendere e recuperare o semplicemente registrare l'errore, è quasi sempre meglio essere il più specifico possibile.

Ma come hai già detto, per la convalida. Avere un metodo di convalida separato è molto meglio.

    
risposta data 04.06.2014 - 18:55
fonte

Leggi altre domande sui tag