11.9 纯方法和非纯方法

前面的静态方法 add 没有修改任何形参,而是创建并返回了一个新的 Time 对象。作为一种替代方案,可编写一个类似于下面这样的方法:

  1. public void increment(double seconds) {
  2. this.second += seconds;
  3. while (this.second >= 60.0) {
  4. this.second -= 60.0;
  5. this.minute += 1;
  6. }
  7. while (this.minute >= 60) {
  8. this.minute -= 60;
  9. this.hour += 1;
  10. }
  11. }

方法 increment 直接修改当前的 Time 对象,而不是创建并返回一个新的 Time 对象。

add 那样的方法被称为纯方法(pure method),因为:

  • 它们没有修改形参;

  • 它们没有任何“副作用”,如打印;

  • 它们的返回值完全取决于形参,而不受任何其他状态的影响。

方法 increment 违反了第一条规则,像它这样的方法有时被称为非纯方法(modifier)。非纯方法通常是 void 方法,但有些也返回一个引用,用于指向它们修改的对象。

因为非纯方法不创建对象,所以效率可能更高,但也更容易出错。如果对象被多个变量指向,可能难以搞清楚非纯方法带来的影响。

要想让类像 String 那样不可修改,可以只提供获取方法,而不提供设置方法,同时只提供纯方法,而不提供非纯方法。不可修改的对象看似用起来更麻烦,但可节省大量的调试时间。