6

私は次のクラスを持っています:

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;
    }

}

setName と setId がそのフィールドの同じ検証をコンストラクターと共有していることに気付いた場合。この冗長なコードは将来的に問題を引き起こす可能性がありますか? . プライベート メソッドを使用してチェックを行い、それをコンストラクターとセッターの間で共有する必要があります。

注:これが、コンストラクターでセッターを使用しない理由です。https://stackoverflow.com/a/4893604/302707

4

4 に答える 4

2

改訂されたコードは次のとおりです。

public class Project {

    private int id;
    private String name;  

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

        checkId(id);
            checkName(name);
            //Insted of lines above you can call setters too.

            this.name = name;
            this.id = id;

    }

    private Project(){}

    public int getId() {
        return id;
    }

    public void setId(int id) { 
        checkId(id);
        this.id = id;
    }

    public String getName()
        return name;
    }

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

    private void checkId(int id){
       if(id == 0 ){
            throw new IllegalArgumentException("id can't be zero");
        }
    }

    private void checkName(String name){
            if(name == null ){
            throw new NullPointerException("Name can't be null");
        }
    }

}
于 2012-09-01T16:42:13.613 に答える
1

フィールドごとに1つのメソッドを定義してisValid()から、コンストラクターだけでなくセッターでも同じメソッドを呼び出すことをお勧めします。

于 2012-09-01T16:30:27.980 に答える
0

はいと思います。それではなく、コンストラクターからセッターを呼び出すだけです。

public Project(int id, String name, Date creationDate, int fps, List<String> frames) {
    setName(name);
    setId(id);
    // other stuff with creationDate, fps and frames?
}

また、でnullnameをチェックするべきではありませんgetName-でそれを行いsetNameます。そうしないと、バグを追跡するのが難しくなります。無効な名前は、使用されたときではなく、入ってすぐに見つけたいと考えています(かなり後である可能性があります)。

于 2012-09-01T16:34:37.103 に答える
0

Project不変にすると、冗長なコードがなくなります。しかし今のところ、コンストラクターとミューテーターの両方のメソッドで例外を明示的にスローしても問題ないと思います。

そして、これを含む多くの理由で、コンストラクター内でミューテーター メソッドを呼び出しません。また、アクセサーメソッドの検証コードを削除します...必要ありません。

于 2012-09-01T16:35:14.237 に答える