构造函数参数验证和设置器

时间:2015-10-08 05:23:31

标签: constructor setter

我被告知使用setter来更改对象的属性,并让setter验证属性设置的数据。由于子类覆盖,我也被告知不要在构造函数中使用setter。你应该如何在允许覆盖你的setter的同时验证构造函数的参数?你应该重复验证码吗?

使用setter:

public class A {
    private int x;
    public A(int x){
        setX(x);
    }
    public void setX(int x) {
        if (x > 6)
            this.x = x;
        else
            this.x = 7;
    }
}

没有制定者:

public class A {
    private int x;
    public A(int x){
        this.x = x;
    }
    public void setX(int x) {
        if (x > 6)
            this.x = x;
        else
            this.x = 7;
    }
}

没有setter和doubled代码:

public class A {
    private int x;
    public A(int x){
        if (x > 6)
            this.x = x;
        else
            this.x = 7;
    }
    public void setX(int x) {
        if (x > 6)
            this.x = x;
        else
            this.x = 7;
    }
}

1 个答案:

答案 0 :(得分:0)

一个选项是你编写一个在setter和构造函数中使用的私有方法,这样你就不会使代码加倍,子类可以轻松覆盖setter。这是我的方式。

如果您不允许这样做,则必须使用加倍代码。

----编辑:----

这仅适用于长时间检查或者不应设置默认值。

public class A {
  private int x;
  public A(int x){
    if(checkX())
       this.x=x;
    else
      this.x = 7;
  }
  public void setX(int x) {
    if (checkX(x))
      this.x = x;
    else
      this.x = 7;
  }
  private boolean checkX(int x) {
    if (x > 6)
      return true;
    else 
      retrun false;
  }
}