PIPIONE
构造函数基本上是一种可以用来确保类的对象有效的方法。这是构造函数的主要动力。假设您希望您的类具有单个整数字段,且该字段应始终大于零。您如何以可靠的方式做到这一点?public class C { private int number; public C(int number) { setNumber(number); } public void setNumber(int number) { if (number < 1) { throws IllegalArgumentException("C cannot store anything smaller than 1"); } this.number = number; }}在上面的代码中,您似乎在做多余的事情,但实际上,您可以确保该数字始终有效,无论如何。“初始化类的实例”是什么一个构造函数,但不是这个原因,为什么我们有构造函数。问题是关于构造函数的目的。您也可以使用c.setNumber(10)上面的示例在外部初始化类的实例。因此,构造函数不是初始化实例的唯一方法。构造函数可以安全地执行此操作。换句话说,仅一个类就解决了确保其对象始终处于有效状态的整个问题。不使用构造函数会使这种验证留给外界,这是不好的设计。这是另一个示例:public class Interval { private long start; private long end; public Interval(long start, long end) { changeInterval(start, end); } public void changeInterval(long start, long end) { if (start >= end) { throw new IllegalArgumentException("Invalid interval."); } this.start = start; this.end = end; } public long duration() { return end - start; }}Interval类表示一个时间间隔。时间存储使用很长时间。间隔在开始之前结束没有任何意义。通过使用类似上面的构造器,就不可能在系统中任何给定时刻的任何地方都具有Interval实例,该实例存储了没有意义的间隔。