正确定义构造函数的方法?

时间:2015-09-03 02:26:06

标签: java oop constructor

我想知道在Java中定义构造函数的正确方法。 这可能不是一个很好的问题,但仍然可以在这里提出。

假设我有这门课程:

public class Element {
    private String value;
    private Date timestamp;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public Date getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Date timestamp) {
        this.timestamp = timestamp;
    }

    public Element(String value, Date timestamp) {
        this.value = value;
        this.timestamp = timestamp;
    }
}

我可以使用setter定义构造函数吗?

public Element(String value, Date timestamp) {
    setValue(value);
    setTimestamp(timestamp);
}

哪个更好的设计?第一个似乎是标准,我也一直在使用它。

2 个答案:

答案 0 :(得分:0)

假设我们在setter中定义了一个约束。

public class Person {
   private int weight = 0;

   public Person(int weight) {
        this.weight = weight;
   }

   public void setWeight(int weight) {
        if(weight > 200) throw new IllegalArgumentException("Weight unreasonable");
        this.weight = weight;
   }
}

现在,使用setter,我们可以为类引入过滤器,逻辑或行为。一个人的重量不得超过200.但是使用构造函数时,不应用权重规则。你可以new Person(10000)

因此,为了保护对象的行为,它建议在设置成员变量的值时在构造函数中使用setter。

public Person(int weight) {
    setWeight(weight);
}

因此,构造函数不会破坏weight

的预期行为

答案 1 :(得分:-1)

是。您可以通过这种方式定义构造函数。我已经使用swing(JButtons等)完成了几次,并且它完美地工作了。这是组织代码的一种巧妙方式 - 特别是如果你要验证任何一个参数。

此外,它可能有助于继承,你只需要覆盖设置者并使用超级课程'构造

所以,至少在我看来,第二种设计更好。

你的问题非常合理!