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 与构造函数共享其字段的相同验证。这个冗余代码是否会在将来导致问题(例如,如果有人编辑 setter 以允许 0 为 id 并阻止 -1 但没有更改构造函数)?. 我是否应该使用私有方法进行检查并在构造函数和设置器之间共享它,如果有很多字段,这似乎太多了。

注意:这就是为什么我不在构造函数中使用设置器的原因。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

我建议您应该为每个字段定义一个方法isValid(),然后在您的 setter 和 Constructor 中调用相同的方法。

于 2012-09-01T16:30:27.980 回答
0

如果您使Project不可变,它将消除冗余代码。但是现在,我认为在构造函数和 mutator 方法中显式抛出异常是可以的。

由于很多原因,我不会在构造函数中调用 mutator 方法,包括this。另外,我会删除访问器方法中的验证代码......这不是必需的。

于 2012-09-01T16:35:14.237 回答
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?
}

此外,您不应该检查空值-name在. 否则,错误将很难追踪——您希望在无效名称出现时立即捕获它,而不是在使用它时(可能要晚得多)。getNamesetName

于 2012-09-01T16:34:37.103 回答