java - 构造函数和 setter 中的验证字段是否被认为是错误的冗余代码?

标签 java coding-style getter-setter

我有以下类(class):

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 而不是更改构造函数)? .我是否应该使用私有(private)方法进行检查并在构造函数和 setter 之间共享它,如果有很多字段,这似乎太多了。

注意:这就是我不在构造函数中使用 setter 的原因。 https://stackoverflow.com/a/4893604/302707

最佳答案

修改后的代码:

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

}

关于java - 构造函数和 setter 中的验证字段是否被认为是错误的冗余代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12229457/

相关文章:

java regex/arraylist问题,无法获取匹配/arraylist存储新值

java - Java 字符串连接运算符 "+"的样式建议是什么?

c++ - 断言返回值,但以任何一种方式运行

c++ - 在 C++ 中编写函数指针的 setter 和 getter

java - 为什么 JAXB 不为列表生成 setter

java - 从文本文件 : Java 创建迷宫图

java - 修改现有的 smali 常量/方法

java - 实体名称无法正常运行

c# - 缩进 lambda 和嵌套操作

java - 如何忽略从java中的lombok生成一个字段