11.9 纯方法和非纯方法
前面的静态方法 add 没有修改任何形参,而是创建并返回了一个新的 Time 对象。作为一种替代方案,可编写一个类似于下面这样的方法:
public void increment(double seconds) {this.second += seconds;while (this.second >= 60.0) {this.second -= 60.0;this.minute += 1;}while (this.minute >= 60) {this.minute -= 60;this.hour += 1;}}
方法 increment 直接修改当前的 Time 对象,而不是创建并返回一个新的 Time 对象。
像 add 那样的方法被称为纯方法(pure method),因为:
它们没有修改形参;
它们没有任何“副作用”,如打印;
它们的返回值完全取决于形参,而不受任何其他状态的影响。
方法 increment 违反了第一条规则,像它这样的方法有时被称为非纯方法(modifier)。非纯方法通常是 void 方法,但有些也返回一个引用,用于指向它们修改的对象。
因为非纯方法不创建对象,所以效率可能更高,但也更容易出错。如果对象被多个变量指向,可能难以搞清楚非纯方法带来的影响。
要想让类像 String 那样不可修改,可以只提供获取方法,而不提供设置方法,同时只提供纯方法,而不提供非纯方法。不可修改的对象看似用起来更麻烦,但可节省大量的调试时间。
