重构勘误

以下是《重构》一书中已知的错误。

第 24 版及以后的印刷错误

第 12 页

有人问我关于 double 到 int 舍入的更多信息。它发生在你有复合赋值的时候。换句话说

  int foo=1;
  foo += 1.5;
  

可以编译,因为它等同于

  int foo = 1;
  foo = (int) (foo + 1.5);
  

我没有研究过这背后的原因。(参见 Java 语言规范,第 15.26.2 节)

(在重印中无法修复。)

第 148 页

在上面的代码示例中,行

private double  _interestRate

应该改为

private double _interestRate

因为这段代码在此时已被删除。

第 166 页

在第六个代码示例中,行

class mfDate {

应该改为

class MfDateWrap {

第 166 页

在第五个代码示例中,行

class MfDate…

应该改为

class MfDateSub

第 167 页

在第四个代码示例中,行

class MfDate…

应该改为

class MfDateWrap…

第 258 页

在第一个代码示例中,行

return Employee.ENGINEER;

应该改为

return EmployeeType.ENGINEER;

第 301 页

这个例子有问题,请参见 移除设置方法 中的讨论。

(在重印中无法修复。)

第 316 页

在示例的第一段中,文本“当客户需要资源时,池会将其分配出去……”应该改为“当客户需要资源时,管理器会将其分配出去……”

第 324 页

在第一个代码示例中,行

void createBill(date Date) {

应该改为

void createBill(Date date) {

第 351 页:在 UML 图中,客户和报表之间的关系应该是依赖关系,而不是关联关系。

第 366 页

第一次提到图 12.6 实际上应该指的是图 12.5

第 16 版至第 24 版的印刷错误

第 12 页

有人问我关于 double 到 int 舍入的更多信息。它发生在你有复合赋值的时候。换句话说

  int foo=1;
  foo += 1.5;
  

可以编译,因为它等同于

  int foo = 1;
  foo = (int) (foo + 1.5);
  

我没有研究过这背后的原因。(参见 Java 语言规范,第 15.26.2 节)

(在重印中无法修复。)

第 119 页:在机制的开头添加一个步骤:“检查赋值的右侧是否没有副作用”。[在第 24 版中已更正]

第 148 页

在上面的代码示例中,行

private double  _interestRate

应该改为

private double _interestRate

因为这段代码在此时已被删除。

第 165 页:倒数第二个代码示例不正确,应该改为如下所示。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[在第 24 版中已更正]

第 165 页:在最后一个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页:在倒数第二个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页

在第六个代码示例中,行

class mfDate {

应该改为

class MfDateWrap {

第 166 页

在第五个代码示例中,行

class MfDate…

应该改为

class MfDateSub

第 167 页:大约三分之二处,equals 方法不正确。它应该改为

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[在第 24 版中已更正]

第 167 页

在第四个代码示例中,行

class MfDate…

应该改为

class MfDateWrap…

第 258 页

在第一个代码示例中,行

return Employee.ENGINEER;

应该改为

return EmployeeType.ENGINEER;

第 301 页

这个例子有问题,请参见 移除设置方法 中的讨论。

(在重印中无法修复。)

第 316 页

在示例的第一段中,文本“当客户需要资源时,池会将其分配出去……”应该改为“当客户需要资源时,管理器会将其分配出去……”

第 324 页

在第一个代码示例中,行

void createBill(date Date) {

应该改为

void createBill(Date date) {

第 351 页:在 UML 图中,客户和报表之间的关系应该是依赖关系,而不是关联关系。

第 366 页

第一次提到图 12.6 实际上应该指的是图 12.5

第 15 版的印刷错误

第 12 页

有人问我关于 double 到 int 舍入的更多信息。它发生在你有复合赋值的时候。换句话说

  int foo=1;
  foo += 1.5;
  

可以编译,因为它等同于

  int foo = 1;
  foo = (int) (foo + 1.5);
  

我没有研究过这背后的原因。(参见 Java 语言规范,第 15.26.2 节)

(在重印中无法修复。)

第 119 页:在机制的开头添加一个步骤:“检查赋值的右侧是否没有副作用”。[在第 24 版中已更正]

第 148 页

在上面的代码示例中,行

private double  _interestRate

应该改为

private double _interestRate

因为这段代码在此时已被删除。

第 153 页:在第二段第三行,“如 Lea 的章节中所述……”应该改为“如 Lea 章节中所述……”[在第 16 版中已更正]

第 165 页:倒数第二个代码示例不正确,应该改为如下所示。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[在第 24 版中已更正]

第 165 页:在最后一个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页:在倒数第二个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页

在第六个代码示例中,行

class mfDate {

应该改为

class MfDateWrap {

第 166 页

在第五个代码示例中,行

class MfDate…

应该改为

class MfDateSub

第 167 页:大约三分之二处,equals 方法不正确。它应该改为

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[在第 24 版中已更正]

第 167 页

在第四个代码示例中,行

class MfDate…

应该改为

class MfDateWrap…

第 222 页:在页面底部,我将 getCode 方法设为私有。显然,在 BloodGroup 的任何客户端使用该方法时,我无法这样做。因此,句子“我也可以将方法设为私有……”应该改为“如果没有任何客户端使用数字代码,我也可以将方法设为私有……”[在第 16 版中已更正]

第 258 页

在第一个代码示例中,行

return Employee.ENGINEER;

应该改为

return EmployeeType.ENGINEER;

第 301 页

这个例子有问题,请参见 移除设置方法 中的讨论。

(在重印中无法修复。)

第 316 页

在示例的第一段中,文本“当客户需要资源时,池会将其分配出去……”应该改为“当客户需要资源时,管理器会将其分配出去……”

第 324 页

在第一个代码示例中,行

void createBill(date Date) {

应该改为

void createBill(Date date) {

第 351 页:在 UML 图中,客户和报表之间的关系应该是依赖关系,而不是关联关系。

第 366 页

第一次提到图 12.6 实际上应该指的是图 12.5

第 13 版至第 15 版的印刷错误

第 12 页

有人问我关于 double 到 int 舍入的更多信息。它发生在你有复合赋值的时候。换句话说

  int foo=1;
  foo += 1.5;
  

可以编译,因为它等同于

  int foo = 1;
  foo = (int) (foo + 1.5);
  

我没有研究过这背后的原因。(参见 Java 语言规范,第 15.26.2 节)

(在重印中无法修复。)

第 83 页:在“推测性泛化”部分的第一段第二句中,“哦,我认为我们需要能够……”应该改为“哦,我认为我们需要能够做到……”[在第 15 版中已更正]

第 98 页:testReadAtEnd 方法不正确。我查看了我的源文件,发现该方法在那里应该是

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
另一个让我高兴的是,现在我自动插入源代码了![在第 15 版中已更正]

第 115 页:在第三行中,“rerun” 应该改为 “return” [在第 15 版中已更正]

第 119 页:在机制的开头添加一个步骤:“检查赋值的右侧是否没有副作用”。[在第 24 版中已更正]

第 120 页:最后一行,“……只分配一次……”应该改为“……只分配一次……”[在第 15 版中已更正]

第 120 页:在解决方案语句中,短语“用表达式替换对 temp 的所有引用”应该改为“用新方法替换对 temp 的所有引用”[在第 15 版中已更正]

第 128 页:在动机部分的第一段中,表达式“for (int i=0; i<10; i++)”需要一个额外的括号来平衡前面的文本括号。[在第 15 版中已更正]

第 148 页

在上面的代码示例中,行

private double  _interestRate

应该改为

private double _interestRate

因为这段代码在此时已被删除。

第 153 页:在第二段第三行,“如 Lea 的章节中所述……”应该改为“如 Lea 章节中所述……”[在第 16 版中已更正]

第 165 页:倒数第二个代码示例不正确,应该改为如下所示。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[在第 24 版中已更正]

第 165 页:在最后一个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页:在倒数第二个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页

在第六个代码示例中,行

class mfDate {

应该改为

class MfDateWrap {

第 166 页

在第五个代码示例中,行

class MfDate…

应该改为

class MfDateSub

第 167 页:大约三分之二处,equals 方法不正确。它应该改为

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[在第 24 版中已更正]

第 167 页

在第四个代码示例中,行

class MfDate…

应该改为

class MfDateWrap…

第 176 页:在第二段(机制中的一个步骤)中,“更改获取方法”应该改为“更改设置方法”[在第 15 版中已更正]

第 222 页:在页面底部,我将 getCode 方法设为私有。显然,在 BloodGroup 的任何客户端使用该方法时,我无法这样做。因此,句子“我也可以将方法设为私有……”应该改为“如果没有任何客户端使用数字代码,我也可以将方法设为私有……”[在第 16 版中已更正]

第 258 页

在第一个代码示例中,行

return Employee.ENGINEER;

应该改为

return EmployeeType.ENGINEER;

第 301 页

这个例子有问题,请参见 移除设置方法 中的讨论。

(在重印中无法修复。)

第 316 页

在示例的第一段中,文本“当客户需要资源时,池会将其分配出去……”应该改为“当客户需要资源时,管理器会将其分配出去……”

第 324 页

在第一个代码示例中,行

void createBill(date Date) {

应该改为

void createBill(Date date) {

第 349 页:第一段应该以一个右括号结尾,以匹配第一行的左括号。[在第 15 版中已更正]

第 351 页:在 UML 图中,客户和报表之间的关系应该是依赖关系,而不是关联关系。

第 366 页

第一次提到图 12.6 实际上应该指的是图 12.5

第 12 版的印刷错误

第 12 页

有人问我关于 double 到 int 舍入的更多信息。它发生在你有复合赋值的时候。换句话说

  int foo=1;
  foo += 1.5;
  

可以编译,因为它等同于

  int foo = 1;
  foo = (int) (foo + 1.5);
  

我没有研究过这背后的原因。(参见 Java 语言规范,第 15.26.2 节)

(在重印中无法修复。)

第 83 页:在“推测性泛化”部分的第一段第二句中,“哦,我认为我们需要能够……”应该改为“哦,我认为我们需要能够做到……”[在第 15 版中已更正]

第 98 页:testReadAtEnd 方法不正确。我查看了我的源文件,发现该方法在那里应该是

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
另一个让我高兴的是,现在我自动插入源代码了![在第 15 版中已更正]

第 115 页:在第三行中,“rerun” 应该改为 “return” [在第 15 版中已更正]

第 119 页:在机制的开头添加一个步骤:“检查赋值的右侧是否没有副作用”。[在第 24 版中已更正]

第 120 页:最后一行,“……只分配一次……”应该改为“……只分配一次……”[在第 15 版中已更正]

第 120 页:在解决方案语句中,短语“用表达式替换对 temp 的所有引用”应该改为“用新方法替换对 temp 的所有引用”[在第 15 版中已更正]

第 121 页:这是一个对早期错误的错误修复。在机制的最后一行中,重构“用内联临时变量替换临时变量”应该改为“内联临时变量”。第 122 页也存在同样的问题。[在第 13 版中已更正]

第 128 页:在动机部分的第一段中,表达式“for (int i=0; i<10; i++)”需要一个额外的括号来平衡前面的文本括号。[在第 15 版中已更正]

第 148 页

在上面的代码示例中,行

private double  _interestRate

应该改为

private double _interestRate

因为这段代码在此时已被删除。

第 153 页:在第二段第三行,“如 Lea 的章节中所述……”应该改为“如 Lea 章节中所述……”[在第 16 版中已更正]

第 165 页:倒数第二个代码示例不正确,应该改为如下所示。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[在第 24 版中已更正]

第 165 页:在最后一个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页:在倒数第二个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页

在第六个代码示例中,行

class mfDate {

应该改为

class MfDateWrap {

第 166 页

在第五个代码示例中,行

class MfDate…

应该改为

class MfDateSub

第 167 页:大约三分之二处,equals 方法不正确。它应该改为

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[在第 24 版中已更正]

第 167 页

在第四个代码示例中,行

class MfDate…

应该改为

class MfDateWrap…

第 176 页:在第二段(机制中的一个步骤)中,“更改获取方法”应该改为“更改设置方法”[在第 15 版中已更正]

第 222 页:在页面底部,我将 getCode 方法设为私有。显然,在 BloodGroup 的任何客户端使用该方法时,我无法这样做。因此,句子“我也可以将方法设为私有……”应该改为“如果没有任何客户端使用数字代码,我也可以将方法设为私有……”[在第 16 版中已更正]

第 225 页:第一次提到 create 方法缺少 static 关键字。[在第 13 版中已更正]

第 258 页

在第一个代码示例中,行

return Employee.ENGINEER;

应该改为

return EmployeeType.ENGINEER;

第 301 页

这个例子有问题,请参见 移除设置方法 中的讨论。

(在重印中无法修复。)

第 316 页

在示例的第一段中,文本“当客户需要资源时,池会将其分配出去……”应该改为“当客户需要资源时,管理器会将其分配出去……”

第 324 页

在第一个代码示例中,行

void createBill(date Date) {

应该改为

void createBill(Date date) {

第 349 页:第一段应该以一个右括号结尾,以匹配第一行的左括号。[在第 15 版中已更正]

第 351 页:在 UML 图中,客户和报表之间的关系应该是依赖关系,而不是关联关系。

第 363 页:此页面上对重构的引用是使用章节引用而不是通常的页面引用进行交叉引用的。更糟糕的是,提取类的章节应该是第 7 章。[在第 13 版中已更正]

第 366 页

第一次提到图 12.6 实际上应该指的是图 12.5

第 8 版至第 12 版的印刷错误

第 2 页:在第一段中,“并标识电影类型”应该改为“并标识电影类型”。[在第 12 版中已更正]

第 12 页

有人问我关于 double 到 int 舍入的更多信息。它发生在你有复合赋值的时候。换句话说

  int foo=1;
  foo += 1.5;
  

可以编译,因为它等同于

  int foo = 1;
  foo = (int) (foo + 1.5);
  

我没有研究过这背后的原因。(参见 Java 语言规范,第 15.26.2 节)

(在重印中无法修复。)

第 40 页:在第 40 页和第 41 页的代码示例中,对字段 _name 的引用应该改为 _title [在第 12 版中已更正]

第 83 页:在“推测性泛化”部分的第一段第二句中,“哦,我认为我们需要能够……”应该改为“哦,我认为我们需要能够做到……”[在第 15 版中已更正]

第 98 页:testReadAtEnd 方法不正确。我查看了我的源文件,发现该方法在那里应该是

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
另一个让我高兴的是,现在我自动插入源代码了![在第 15 版中已更正]

第 115 页:在第三行中,“rerun” 应该改为 “return” [在第 15 版中已更正]

第 119 页:在机制的开头添加一个步骤:“检查赋值的右侧是否没有副作用”。[在第 24 版中已更正]

第 120 页:最后一行,“……只分配一次……”应该改为“……只分配一次……”[在第 15 版中已更正]

第 120 页:在解决方案语句中,短语“用表达式替换对 temp 的所有引用”应该改为“用新方法替换对 temp 的所有引用”[在第 15 版中已更正]

第 121 页:这是一个对早期错误的错误修复。在机制的最后一行中,重构“用内联临时变量替换临时变量”应该改为“内联临时变量”。第 122 页也存在同样的问题。[在第 13 版中已更正]

第 128 页:在动机部分的第一段中,表达式“for (int i=0; i<10; i++)”需要一个额外的括号来平衡前面的文本括号。[在第 15 版中已更正]

第 148 页

在上面的代码示例中,行

private double  _interestRate

应该改为

private double _interestRate

因为这段代码在此时已被删除。

第 153 页:在第二段第三行,“如 Lea 的章节中所述……”应该改为“如 Lea 章节中所述……”[在第 16 版中已更正]

第 165 页:倒数第二个代码示例不正确,应该改为如下所示。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[在第 24 版中已更正]

第 165 页:在最后一个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页:在倒数第二个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页

在第六个代码示例中,行

class mfDate {

应该改为

class MfDateWrap {

第 166 页

在第五个代码示例中,行

class MfDate…

应该改为

class MfDateSub

第 167 页:大约三分之二处,equals 方法不正确。它应该改为

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[在第 24 版中已更正]

第 167 页

在第四个代码示例中,行

class MfDate…

应该改为

class MfDateWrap…

第 176 页:在第二段(机制中的一个步骤)中,“更改获取方法”应该改为“更改设置方法”[在第 15 版中已更正]

第 185 页:在第二段中,“biwise xor” 应该改为 “bitwise xor” [在第 12 版中已更正]

第 222 页:在页面底部,我将 getCode 方法设为私有。显然,在 BloodGroup 的任何客户端使用该方法时,我无法这样做。因此,句子“我也可以将方法设为私有……”应该改为“如果没有任何客户端使用数字代码,我也可以将方法设为私有……”[在第 16 版中已更正]

第 225 页:第一次提到 create 方法缺少 static 关键字。[在第 13 版中已更正]

第 258 页

在第一个代码示例中,行

return Employee.ENGINEER;

应该改为

return EmployeeType.ENGINEER;

第 301 页

这个例子有问题,请参见 移除设置方法 中的讨论。

(在重印中无法修复。)

第 316 页

在示例的第一段中,文本“当客户需要资源时,池会将其分配出去……”应该改为“当客户需要资源时,管理器会将其分配出去……”

第 324 页

在第一个代码示例中,行

void createBill(date Date) {

应该改为

void createBill(Date date) {

第 349 页:第一段应该以一个右括号结尾,以匹配第一行的左括号。[在第 15 版中已更正]

第 351 页:在 UML 图中,客户和报表之间的关系应该是依赖关系,而不是关联关系。

第 363 页:此页面上对重构的引用是使用章节引用而不是通常的页面引用进行交叉引用的。更糟糕的是,提取类的章节应该是第 7 章。[在第 13 版中已更正]

第 366 页

第一次提到图 12.6 实际上应该指的是图 12.5

第 5 版至第 8 版的印刷错误

第 2 页:在第一段中,“并标识电影类型”应该改为“并标识电影类型”。[在第 12 版中已更正]

第 12 页

有人问我关于 double 到 int 舍入的更多信息。它发生在你有复合赋值的时候。换句话说

  int foo=1;
  foo += 1.5;
  

可以编译,因为它等同于

  int foo = 1;
  foo = (int) (foo + 1.5);
  

我没有研究过这背后的原因。(参见 Java 语言规范,第 15.26.2 节)

(在重印中无法修复。)

第 25 页:图 1.7 的标题“提取之前的时序图……”应该改为“提取之后的时序图……”[在第 8 版中已更正]

第 40 页:在第 40 页和第 41 页的代码示例中,对字段 _name 的引用应该改为 _title [在第 12 版中已更正]

第 76 页:“重复代码”中的第三段。“在两个类中,然后向上移动字段(320)”应该改为“在两个类中,然后向上移动方法(322)”[在第 8 版中已更正]

第 83 页:在“推测性泛化”部分的第一段第二句中,“哦,我认为我们需要能够……”应该改为“哦,我认为我们需要能够做到……”[在第 15 版中已更正]

第 98 页:testReadAtEnd 方法不正确。我查看了我的源文件,发现该方法在那里应该是

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
另一个让我高兴的是,现在我自动插入源代码了![在第 15 版中已更正]

第 115 页:在第三行中,“rerun” 应该改为 “return” [在第 15 版中已更正]

第 119 页:在机制的开头添加一个步骤:“检查赋值的右侧是否没有副作用”。[在第 24 版中已更正]

第 120 页:最后一行,“……只分配一次……”应该改为“……只分配一次……”[在第 15 版中已更正]

第 120 页:在解决方案语句中,短语“用表达式替换对 temp 的所有引用”应该改为“用新方法替换对 temp 的所有引用”[在第 15 版中已更正]

第 121 页:在机制的最后一步中,我说使用用查询替换临时变量(120),这应该改为对内联临时变量(119)的引用。否则,我会得到一个递归重构。这个问题在第 122 页的示例中继续存在,在那里交叉引用也应该改为内联临时变量(119)。这个问题在第 8 版中被错误地修复了(见下文)[在第 8 版中已更正]

第 121 页:这是一个对早期错误的错误修复。在机制的最后一行中,重构“用内联临时变量替换临时变量”应该改为“内联临时变量”。第 122 页也存在同样的问题。[在第 13 版中已更正]

第 128 页:在动机部分的第一段中,表达式“for (int i=0; i<10; i++)”需要一个额外的括号来平衡前面的文本括号。[在第 15 版中已更正]

第 148 页

在上面的代码示例中,行

private double  _interestRate

应该改为

private double _interestRate

因为这段代码在此时已被删除。

第 153 页:在第二段第三行,“如 Lea 的章节中所述……”应该改为“如 Lea 章节中所述……”[在第 16 版中已更正]

第 165 页:倒数第二个代码示例不正确,应该改为如下所示。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[在第 24 版中已更正]

第 165 页:在最后一个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页:在倒数第二个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页

在第六个代码示例中,行

class mfDate {

应该改为

class MfDateWrap {

第 166 页

在第五个代码示例中,行

class MfDate…

应该改为

class MfDateSub

第 167 页:大约三分之二处,equals 方法不正确。它应该改为

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[在第 24 版中已更正]

第 167 页

在第四个代码示例中,行

class MfDate…

应该改为

class MfDateWrap…

第 176 页:在第二段(机制中的一个步骤)中,“更改获取方法”应该改为“更改设置方法”[在第 15 版中已更正]

第 176 页:numberOfOrdersFor 方法中,读取 if (each.getCustomerName().equals(customer)) result++; 的行应该改为 if (each.getCustomer().equals(customer)) result++; [在第 8 版中已更正]

第 177 页:setCustomer 方法的第一个状态中,读取 _customer = new Customer (customer); 的行应该改为 _customer = new Customer (arg); [在第 8 版中已更正]

第 185 页:在第二段中,“biwise xor” 应该改为 “bitwise xor” [在第 12 版中已更正]

第 219 页:“在页面中间附近的一段中,句子“……需要一个返回代码的新方法”应该改为“……需要一个返回新类实例的新方法。”[在第 8 版中已更正]

第 222 页:在页面底部,我将 getCode 方法设为私有。显然,在 BloodGroup 的任何客户端使用该方法时,我无法这样做。因此,句子“我也可以将方法设为私有……”应该改为“如果没有任何客户端使用数字代码,我也可以将方法设为私有……”[在第 16 版中已更正]

第 222 页:“在划掉的代码中,方法 "public int getBloodGroup() {" 应该改为 "public int getBloodGroupCode() {"(我刚重命名了它!)”[在第 8 版中已更正]

第 225 页:第一次提到 create 方法缺少 static 关键字。[在第 13 版中已更正]

第 258 页

在第一个代码示例中,行

return Employee.ENGINEER;

应该改为

return EmployeeType.ENGINEER;

第 285 页:之前的代码包含一个比重构旨在解决的更严重的错误,因为断言总是被执行。之前的代码应该改为

  void setValue (String name, int value) {
    if (name.equals("height")) {
      _height = value;
      return;
    }
    if (name.equals("width")) {
      _width = value;
      return;
    }
    Assert.shouldNeverReachHere();
  }
  
[在第 8 版中已更正]

第 301 页

这个例子有问题,请参见 移除设置方法 中的讨论。

(在重印中无法修复。)

第 313 页

读取

  Assert.isTrue("amount too large", amount > _balance); 
  

的代码行有错误,因为布尔值的含义是错误的。更好的代码行应该是

  Assert.isTrue("sufficient funds", amount <= _balance);
  
[在第 8 版中已更正]

第 316 页

在示例的第一段中,文本“当客户需要资源时,池会将其分配出去……”应该改为“当客户需要资源时,管理器会将其分配出去……”

第 324 页

在第一个代码示例中,行

void createBill(date Date) {

应该改为

void createBill(Date date) {

第 324 页:在上面的代码示例中,行 double chargeAmount = charge (lastBillDate, date) 应该改为 double chargeAmount = chargeFor (lastBillDate, date)。(我让方法名称与图表不一致。)[在第 8 版中已更正]

第 328 页:在动机段落中,“向下移动方法”应该改为“向下推方法”。(这是当我没有为所有内容使用链接时会发生的事情!)[在第 8 版中已更正]

第 349 页:第一段应该以一个右括号结尾,以匹配第一行的左括号。[在第 15 版中已更正]

第 351 页:在 UML 图中,客户和报表之间的关系应该是依赖关系,而不是关联关系。

第 363 页:此页面上对重构的引用是使用章节引用而不是通常的页面引用进行交叉引用的。更糟糕的是,提取类的章节应该是第 7 章。[在第 13 版中已更正]

第 366 页

第一次提到图 12.6 实际上应该指的是图 12.5

第 4 版的印刷错误

第 xx 页:“Joshua 建议了代码草图的想法”应该改为“Joshua Kerievsky 建议了代码草图的想法”[在第 5 版中已更正]

第 2 页:在第一段中,“并标识电影类型”应该改为“并标识电影类型”。[在第 12 版中已更正]

第 12 页

有人问我关于 double 到 int 舍入的更多信息。它发生在你有复合赋值的时候。换句话说

  int foo=1;
  foo += 1.5;
  

可以编译,因为它等同于

  int foo = 1;
  foo = (int) (foo + 1.5);
  

我没有研究过这背后的原因。(参见 Java 语言规范,第 15.26.2 节)

(在重印中无法修复。)

第 25 页:图 1.7 的标题“提取之前的时序图……”应该改为“提取之后的时序图……”[在第 8 版中已更正]

第 40 页:在第 40 页和第 41 页的代码示例中,对字段 _name 的引用应该改为 _title [在第 12 版中已更正]

第 76 页:“重复代码”中的第三段。“在两个类中,然后向上移动字段(320)”应该改为“在两个类中,然后向上移动方法(322)”[在第 8 版中已更正]

第 83 页:在“推测性泛化”部分的第一段第二句中,“哦,我认为我们需要能够……”应该改为“哦,我认为我们需要能够做到……”[在第 15 版中已更正]

第 98 页:testReadAtEnd 方法不正确。我查看了我的源文件,发现该方法在那里应该是

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
另一个让我高兴的是,现在我自动插入源代码了![在第 15 版中已更正]

第 115 页:在第三行中,“rerun” 应该改为 “return” [在第 15 版中已更正]

第 119 页:在机制的开头添加一个步骤:“检查赋值的右侧是否没有副作用”。[在第 24 版中已更正]

第 120 页:最后一行,“……只分配一次……”应该改为“……只分配一次……”[在第 15 版中已更正]

第 120 页:在解决方案语句中,短语“用表达式替换对 temp 的所有引用”应该改为“用新方法替换对 temp 的所有引用”[在第 15 版中已更正]

第 121 页:在机制的最后一步中,我说使用用查询替换临时变量(120),这应该改为对内联临时变量(119)的引用。否则,我会得到一个递归重构。这个问题在第 122 页的示例中继续存在,在那里交叉引用也应该改为内联临时变量(119)。这个问题在第 8 版中被错误地修复了(见下文)[在第 8 版中已更正]

第 121 页:这是一个对早期错误的错误修复。在机制的最后一行中,重构“用内联临时变量替换临时变量”应该改为“内联临时变量”。第 122 页也存在同样的问题。[在第 13 版中已更正]

第 128 页:在动机部分的第一段中,表达式“for (int i=0; i<10; i++)”需要一个额外的括号来平衡前面的文本括号。[在第 15 版中已更正]

第 148 页

在上面的代码示例中,行

private double  _interestRate

应该改为

private double _interestRate

因为这段代码在此时已被删除。

第 153 页:在第二段第三行,“如 Lea 的章节中所述……”应该改为“如 Lea 章节中所述……”[在第 16 版中已更正]

第 165 页:倒数第二个代码示例不正确,应该改为如下所示。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[在第 24 版中已更正]

第 165 页:在最后一个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页:在倒数第二个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页

在第六个代码示例中,行

class mfDate {

应该改为

class MfDateWrap {

第 166 页

在第五个代码示例中,行

class MfDate…

应该改为

class MfDateSub

第 167 页:大约三分之二处,equals 方法不正确。它应该改为

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[在第 24 版中已更正]

第 167 页

在第四个代码示例中,行

class MfDate…

应该改为

class MfDateWrap…

第 176 页:在第二段(机制中的一个步骤)中,“更改获取方法”应该改为“更改设置方法”[在第 15 版中已更正]

第 176 页:numberOfOrdersFor 方法中,读取 if (each.getCustomerName().equals(customer)) result++; 的行应该改为 if (each.getCustomer().equals(customer)) result++; [在第 8 版中已更正]

第 177 页:setCustomer 方法的第一个状态中,读取 _customer = new Customer (customer); 的行应该改为 _customer = new Customer (arg); [在第 8 版中已更正]

第 185 页:在第二段中,“biwise xor” 应该改为 “bitwise xor” [在第 12 版中已更正]

第 193 页:“声明间隔窗口实现 Observable”应该改为“声明间隔窗口实现观察者”[在第 5 版中已更正]

第 219 页:“在页面中间附近的一段中,句子“……需要一个返回代码的新方法”应该改为“……需要一个返回新类实例的新方法。”[在第 8 版中已更正]

第 222 页:在页面底部,我将 getCode 方法设为私有。显然,在 BloodGroup 的任何客户端使用该方法时,我无法这样做。因此,句子“我也可以将方法设为私有……”应该改为“如果没有任何客户端使用数字代码,我也可以将方法设为私有……”[在第 16 版中已更正]

第 222 页:“在划掉的代码中,方法 "public int getBloodGroup() {" 应该改为 "public int getBloodGroupCode() {"(我刚重命名了它!)”[在第 8 版中已更正]

第 225 页:第一次提到 create 方法缺少 static 关键字。[在第 13 版中已更正]

第 258 页

在第一个代码示例中,行

return Employee.ENGINEER;

应该改为

return EmployeeType.ENGINEER;

第 261 页:在 Ron 的故事中,第四段,“当然,只要你开始检查……”,但应该是“当然,只要你开始检查……”[在第 5 版中已更正]

第 285 页:之前的代码包含一个比重构旨在解决的更严重的错误,因为断言总是被执行。之前的代码应该改为

  void setValue (String name, int value) {
    if (name.equals("height")) {
      _height = value;
      return;
    }
    if (name.equals("width")) {
      _width = value;
      return;
    }
    Assert.shouldNeverReachHere();
  }
  
[在第 8 版中已更正]

第 300 页:在机制部分,字段应该在过程结束时被设为 final,而不是在开始时。[在第 5 版中已更正]

第 301 页

这个例子有问题,请参见 移除设置方法 中的讨论。

(在重印中无法修复。)

第 307 页:“另一个需要注意 Class.forName 的原因是……”应该改为:“另一个需要注意 Class.forName 的原因是……”(Class 应该大写)[在第 5 版中已更正]

第 307 页:“我可以使用不同的方法……”应该改为:“我可以使用不同的方法……”(拼写)[在第 5 版中已更正]

第 311 页:“如果异常是检查的,请调整调用者……”应该改为:“如果异常检查的,请调整调用者……”[在第 5 版中已更正]

第 313 页

读取

  Assert.isTrue("amount too large", amount > _balance); 
  

的代码行有错误,因为布尔值的含义是错误的。更好的代码行应该是

  Assert.isTrue("sufficient funds", amount <= _balance);
  
[在第 8 版中已更正]

第 316 页

在示例的第一段中,文本“当客户需要资源时,池会将其分配出去……”应该改为“当客户需要资源时,管理器会将其分配出去……”

第 324 页

在第一个代码示例中,行

void createBill(date Date) {

应该改为

void createBill(Date date) {

第 324 页:在上面的代码示例中,行 double chargeAmount = charge (lastBillDate, date) 应该改为 double chargeAmount = chargeFor (lastBillDate, date)。(我让方法名称与图表不一致。)[在第 8 版中已更正]

第 328 页:在动机段落中,“向下移动方法”应该改为“向下推方法”。(这是当我没有为所有内容使用链接时会发生的事情!)[在第 8 版中已更正]

第 333 页:“劳动力项目需要一些参数,而有些参数不需要”应该改为:“一些参数是需要的……”(缺少单词)[在第 5 版中已更正]

第 346 页:“每当我们看到两个类似的方法”应该改为:“每当我们看到两个类似的方法”[在第 5 版中已更正]

第 346 页:“statement 方法打印报表”应该改为:“statement 方法打印报表”[在第 5 版中已更正]

第 349 页:第一段应该以一个右括号结尾,以匹配第一行的左括号。[在第 15 版中已更正]

第 351 页:在 UML 图中,客户和报表之间的关系应该是依赖关系,而不是关联关系。

第 363 页:此页面上对重构的引用是使用章节引用而不是通常的页面引用进行交叉引用的。更糟糕的是,提取类的章节应该是第 7 章。[在第 13 版中已更正]

第 366 页

第一次提到图 12.6 实际上应该指的是图 12.5

第 3 版的印刷错误

第 xx 页:“Joshua 建议了代码草图的想法”应该改为“Joshua Kerievsky 建议了代码草图的想法”[在第 5 版中已更正]

第 2 页:在第一段中,“并标识电影类型”应该改为“并标识电影类型”。[在第 12 版中已更正]

第 12 页

有人问我关于 double 到 int 舍入的更多信息。它发生在你有复合赋值的时候。换句话说

  int foo=1;
  foo += 1.5;
  

可以编译,因为它等同于

  int foo = 1;
  foo = (int) (foo + 1.5);
  

我没有研究过这背后的原因。(参见 Java 语言规范,第 15.26.2 节)

(在重印中无法修复。)

第 25 页:图 1.7 的标题“提取之前的时序图……”应该改为“提取之后的时序图……”[在第 8 版中已更正]

第 40 页:在第 40 页和第 41 页的代码示例中,对字段 _name 的引用应该改为 _title [在第 12 版中已更正]

第 76 页:“重复代码”中的第三段。“在两个类中,然后向上移动字段(320)”应该改为“在两个类中,然后向上移动方法(322)”[在第 8 版中已更正]

第 83 页:在“推测性泛化”部分的第一段第二句中,“哦,我认为我们需要能够……”应该改为“哦,我认为我们需要能够做到……”[在第 15 版中已更正]

第 98 页:testReadAtEnd 方法不正确。我查看了我的源文件,发现该方法在那里应该是

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
另一个让我高兴的是,现在我自动插入源代码了![在第 15 版中已更正]

第 115 页:在第三行中,“rerun” 应该改为 “return” [在第 15 版中已更正]

第 119 页:在机制的开头添加一个步骤:“检查赋值的右侧是否没有副作用”。[在第 24 版中已更正]

第 120 页:最后一行,“……只分配一次……”应该改为“……只分配一次……”[在第 15 版中已更正]

第 120 页:在解决方案语句中,短语“用表达式替换对 temp 的所有引用”应该改为“用新方法替换对 temp 的所有引用”[在第 15 版中已更正]

第 121 页:在机制的最后一步中,我说使用用查询替换临时变量(120),这应该改为对内联临时变量(119)的引用。否则,我会得到一个递归重构。这个问题在第 122 页的示例中继续存在,在那里交叉引用也应该改为内联临时变量(119)。这个问题在第 8 版中被错误地修复了(见下文)[在第 8 版中已更正]

第 121 页:这是一个对早期错误的错误修复。在机制的最后一行中,重构“用内联临时变量替换临时变量”应该改为“内联临时变量”。第 122 页也存在同样的问题。[在第 13 版中已更正]

第 128 页:在动机部分的第一段中,表达式“for (int i=0; i<10; i++)”需要一个额外的括号来平衡前面的文本括号。[在第 15 版中已更正]

第 148 页

在上面的代码示例中,行

private double  _interestRate

应该改为

private double _interestRate

因为这段代码在此时已被删除。

第 153 页:在第二段第三行,“如 Lea 的章节中所述……”应该改为“如 Lea 章节中所述……”[在第 16 版中已更正]

第 165 页:倒数第二个代码示例不正确,应该改为如下所示。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[在第 24 版中已更正]

第 165 页:在最后一个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页:在倒数第二个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页

在第六个代码示例中,行

class mfDate {

应该改为

class MfDateWrap {

第 166 页

在第五个代码示例中,行

class MfDate…

应该改为

class MfDateSub

第 167 页:大约三分之二处,equals 方法不正确。它应该改为

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[在第 24 版中已更正]

第 167 页

在第四个代码示例中,行

class MfDate…

应该改为

class MfDateWrap…

第 176 页:在第二段(机制中的一个步骤)中,“更改获取方法”应该改为“更改设置方法”[在第 15 版中已更正]

第 176 页:numberOfOrdersFor 方法中,读取 if (each.getCustomerName().equals(customer)) result++; 的行应该改为 if (each.getCustomer().equals(customer)) result++; [在第 8 版中已更正]

第 177 页:setCustomer 方法的第一个状态中,读取 _customer = new Customer (customer); 的行应该改为 _customer = new Customer (arg); [在第 8 版中已更正]

第 185 页:在第二段中,“biwise xor” 应该改为 “bitwise xor” [在第 12 版中已更正]

第 193 页:“声明间隔窗口实现 Observable”应该改为“声明间隔窗口实现观察者”[在第 5 版中已更正]

第 219 页:“在页面中间附近的一段中,句子“……需要一个返回代码的新方法”应该改为“……需要一个返回新类实例的新方法。”[在第 8 版中已更正]

第 222 页:在页面底部,我将 getCode 方法设为私有。显然,在 BloodGroup 的任何客户端使用该方法时,我无法这样做。因此,句子“我也可以将方法设为私有……”应该改为“如果没有任何客户端使用数字代码,我也可以将方法设为私有……”[在第 16 版中已更正]

第 222 页:“在划掉的代码中,方法 "public int getBloodGroup() {" 应该改为 "public int getBloodGroupCode() {"(我刚重命名了它!)”[在第 8 版中已更正]

第 225 页:第一次提到 create 方法缺少 static 关键字。[在第 13 版中已更正]

第 241 页:在页面底部的代码示例中,方法 isEligibleForDisability 应该改为 isNotEligibleForDisability [在第 4 版中已更正]

第 258 页

在第一个代码示例中,行

return Employee.ENGINEER;

应该改为

return EmployeeType.ENGINEER;

第 261 页:在 Ron 的故事中,第四段,“当然,只要你开始检查……”,但应该是“当然,只要你开始检查……”[在第 5 版中已更正]

第 285 页:之前的代码包含一个比重构旨在解决的更严重的错误,因为断言总是被执行。之前的代码应该改为

  void setValue (String name, int value) {
    if (name.equals("height")) {
      _height = value;
      return;
    }
    if (name.equals("width")) {
      _width = value;
      return;
    }
    Assert.shouldNeverReachHere();
  }
  
[在第 8 版中已更正]

第 300 页:在机制部分,字段应该在过程结束时被设为 final,而不是在开始时。[在第 5 版中已更正]

第 301 页

这个例子有问题,请参见 移除设置方法 中的讨论。

(在重印中无法修复。)

第 307 页:“另一个需要注意 Class.forName 的原因是……”应该改为:“另一个需要注意 Class.forName 的原因是……”(Class 应该大写)[在第 5 版中已更正]

第 307 页:“我可以使用不同的方法……”应该改为:“我可以使用不同的方法……”(拼写)[在第 5 版中已更正]

第 311 页:“如果异常是检查的,请调整调用者……”应该改为:“如果异常检查的,请调整调用者……”[在第 5 版中已更正]

第 313 页

读取

  Assert.isTrue("amount too large", amount > _balance); 
  

的代码行有错误,因为布尔值的含义是错误的。更好的代码行应该是

  Assert.isTrue("sufficient funds", amount <= _balance);
  
[在第 8 版中已更正]

第 315 页:问题陈述应该改为“你在调用者可以先检查的条件上抛出了异常”(重构适用于所有异常,而不仅仅是检查的异常)[在第 4 版中已更正]

第 316 页

在示例的第一段中,文本“当客户需要资源时,池会将其分配出去……”应该改为“当客户需要资源时,管理器会将其分配出去……”

第 324 页

在第一个代码示例中,行

void createBill(date Date) {

应该改为

void createBill(Date date) {

第 324 页:在上面的代码示例中,行 double chargeAmount = charge (lastBillDate, date) 应该改为 double chargeAmount = chargeFor (lastBillDate, date)。(我让方法名称与图表不一致。)[在第 8 版中已更正]

第 328 页:在动机段落中,“向下移动方法”应该改为“向下推方法”。(这是当我没有为所有内容使用链接时会发生的事情!)[在第 8 版中已更正]

第 333 页:“劳动力项目需要一些参数,而有些参数不需要”应该改为:“一些参数是需要的……”(缺少单词)[在第 5 版中已更正]

第 346 页:“每当我们看到两个类似的方法”应该改为:“每当我们看到两个类似的方法”[在第 5 版中已更正]

第 346 页:“statement 方法打印报表”应该改为:“statement 方法打印报表”[在第 5 版中已更正]

第 349 页:第一段应该以一个右括号结尾,以匹配第一行的左括号。[在第 15 版中已更正]

第 351 页:在 UML 图中,客户和报表之间的关系应该是依赖关系,而不是关联关系。

第 363 页:此页面上对重构的引用是使用章节引用而不是通常的页面引用进行交叉引用的。更糟糕的是,提取类的章节应该是第 7 章。[在第 13 版中已更正]

第 366 页

第一次提到图 12.6 实际上应该指的是图 12.5

第 1 版至第 3 版的印刷错误

第 xx 页:“Joshua 建议了代码草图的想法”应该改为“Joshua Kerievsky 建议了代码草图的想法”[在第 5 版中已更正]

第 2 页:在第一段中,“并标识电影类型”应该改为“并标识电影类型”。[在第 12 版中已更正]

第 12 页

有人问我关于 double 到 int 舍入的更多信息。它发生在你有复合赋值的时候。换句话说

  int foo=1;
  foo += 1.5;
  

可以编译,因为它等同于

  int foo = 1;
  foo = (int) (foo + 1.5);
  

我没有研究过这背后的原因。(参见 Java 语言规范,第 15.26.2 节)

(在重印中无法修复。)

第 25 页:图 1.7 的标题“提取之前的时序图……”应该改为“提取之后的时序图……”[在第 8 版中已更正]

第 37 页:“class rental” 应该改为 “class Rental”(大小写),“class movie” 应该改为 “class Movie”(大小写)[在第 3 版中已更正]

第 40 页:在第 40 页和第 41 页的代码示例中,对字段 _name 的引用应该改为 _title [在第 12 版中已更正]

第 48 页:第二行:“class Rental……”应该改为:“class Movie……”[在第 3 版中已更正]

第 70 页:Steve McConnell 的姓氏在两个地方拼错了。[在第 3 版中已更正]

第 76 页:“重复代码”中的第三段。“在两个类中,然后向上移动字段(320)”应该改为“在两个类中,然后向上移动方法(322)”[在第 8 版中已更正]

第 82 页:句子“如果你在 switch 中添加一个新的子句,你必须找到所有这些 switch 语句并更改它们。”第二个逗号应该删除。[在第 3 版中已更正]

第 83 页:在“推测性泛化”部分的第一段第二句中,“哦,我认为我们需要能够……”应该改为“哦,我认为我们需要能够做到……”[在第 15 版中已更正]

第 85 页:“用继承替换委托(355)”在“不适当的亲密关系”中应该改为“用委托替换继承(352)”[在第 3 版中已更正]

第 92 页:在图 4.1 中,从 TestSuite 到 Test 的线应该是关联关系,而不是泛化关系(见下图)。此外,包名应该是 junit.framework。[在第 3 版中已更正]

第 92 页:在示例的测试文件中,George Headley 的职业生涯总得分实际上是 2190 个测试得分。[在第 3 版中已更正]

第 98 页:testReadAtEnd 方法不正确。我查看了我的源文件,发现该方法在那里应该是

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
另一个让我高兴的是,现在我自动插入源代码了![在第 15 版中已更正]

第 115 页:在第二句中,“oustanding” 应该改为 “outstanding” [在第 3 版中已更正]

第 115 页:在第三行中,“rerun” 应该改为 “return” [在第 15 版中已更正]

第 119 页:在机制的开头添加一个步骤:“检查赋值的右侧是否没有副作用”。[在第 24 版中已更正]

第 120 页:最后一行,“……只分配一次……”应该改为“……只分配一次……”[在第 15 版中已更正]

第 120 页:在解决方案语句中,短语“用表达式替换对 temp 的所有引用”应该改为“用新方法替换对 temp 的所有引用”[在第 15 版中已更正]

第 121 页:在机制的最后一步中,我说使用用查询替换临时变量(120),这应该改为对内联临时变量(119)的引用。否则,我会得到一个递归重构。这个问题在第 122 页的示例中继续存在,在那里交叉引用也应该改为内联临时变量(119)。这个问题在第 8 版中被错误地修复了(见下文)[在第 8 版中已更正]

第 121 页:这是一个对早期错误的错误修复。在机制的最后一行中,重构“用内联临时变量替换临时变量”应该改为“内联临时变量”。第 122 页也存在同样的问题。[在第 13 版中已更正]

第 128 页:在动机部分的第一段中,表达式“for (int i=0; i<10; i++)”需要一个额外的括号来平衡前面的文本括号。[在第 15 版中已更正]

第 148 页

在上面的代码示例中,行

private double  _interestRate

应该改为

private double _interestRate

因为这段代码在此时已被删除。

第 153 页:在第二段第三行,“如 Lea 的章节中所述……”应该改为“如 Lea 章节中所述……”[在第 16 版中已更正]

第 165 页:倒数第二个代码示例不正确,应该改为如下所示。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[在第 24 版中已更正]

第 165 页:在最后一个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页:在倒数第二个代码示例中,class mfDate 应该改为 class MfDateWrap [在第 24 版中已更正]

第 166 页

在第六个代码示例中,行

class mfDate {

应该改为

class MfDateWrap {

第 166 页

在第五个代码示例中,行

class MfDate…

应该改为

class MfDateSub

第 167 页:大约三分之二处,equals 方法不正确。它应该改为

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[在第 24 版中已更正]

第 167 页

在第四个代码示例中,行

class MfDate…

应该改为

class MfDateWrap…

第 176 页:在第二段(机制中的一个步骤)中,“更改获取方法”应该改为“更改设置方法”[在第 15 版中已更正]

第 176 页:numberOfOrdersFor 方法中,读取 if (each.getCustomerName().equals(customer)) result++; 的行应该改为 if (each.getCustomer().equals(customer)) result++; [在第 8 版中已更正]

第 177 页:setCustomer 方法的第一个状态中,读取 _customer = new Customer (customer); 的行应该改为 _customer = new Customer (arg); [在第 8 版中已更正]

第 185 页:在第二段中,“biwise xor” 应该改为 “bitwise xor” [在第 12 版中已更正]

第 193 页:“声明间隔窗口实现 Observable”应该改为“声明间隔窗口实现观察者”[在第 5 版中已更正]

第 219 页:“在页面中间附近的一段中,句子“……需要一个返回代码的新方法”应该改为“……需要一个返回新类实例的新方法。”[在第 8 版中已更正]

第 222 页:在页面底部,我将 getCode 方法设为私有。显然,在 BloodGroup 的任何客户端使用该方法时,我无法这样做。因此,句子“我也可以将方法设为私有……”应该改为“如果没有任何客户端使用数字代码,我也可以将方法设为私有……”[在第 16 版中已更正]

第 222 页:“在划掉的代码中,方法 "public int getBloodGroup() {" 应该改为 "public int getBloodGroupCode() {"(我刚重命名了它!)”[在第 8 版中已更正]

第 225 页:第一次提到 create 方法缺少 static 关键字。[在第 13 版中已更正]

第 241 页:在页面底部的代码示例中,方法 isEligibleForDisability 应该改为 isNotEligibleForDisability [在第 4 版中已更正]

第 258 页

在第一个代码示例中,行

return Employee.ENGINEER;

应该改为

return EmployeeType.ENGINEER;

第 261 页:在 Ron 的故事中,第四段,“当然,只要你开始检查……”,但应该是“当然,只要你开始检查……”[在第 5 版中已更正]

第 285 页:之前的代码包含一个比重构旨在解决的更严重的错误,因为断言总是被执行。之前的代码应该改为

  void setValue (String name, int value) {
    if (name.equals("height")) {
      _height = value;
      return;
    }
    if (name.equals("width")) {
      _width = value;
      return;
    }
    Assert.shouldNeverReachHere();
  }
  
[在第 8 版中已更正]

第 300 页:在机制部分,字段应该在过程结束时被设为 final,而不是在开始时。[在第 5 版中已更正]

第 301 页

这个例子有问题,请参见 移除设置方法 中的讨论。

(在重印中无法修复。)

第 307 页:“另一个需要注意 Class.forName 的原因是……”应该改为:“另一个需要注意 Class.forName 的原因是……”(Class 应该大写)[在第 5 版中已更正]

第 307 页:“我可以使用不同的方法……”应该改为:“我可以使用不同的方法……”(拼写)[在第 5 版中已更正]

第 311 页:“如果异常是检查的,请调整调用者……”应该改为:“如果异常检查的,请调整调用者……”[在第 5 版中已更正]

第 313 页

读取

  Assert.isTrue("amount too large", amount > _balance); 
  

的代码行有错误,因为布尔值的含义是错误的。更好的代码行应该是

  Assert.isTrue("sufficient funds", amount <= _balance);
  
[在第 8 版中已更正]

第 315 页:问题陈述应该改为“你在调用者可以先检查的条件上抛出了异常”(重构适用于所有异常,而不仅仅是检查的异常)[在第 4 版中已更正]

第 316 页

在示例的第一段中,文本“当客户需要资源时,池会将其分配出去……”应该改为“当客户需要资源时,管理器会将其分配出去……”

第 324 页

在第一个代码示例中,行

void createBill(date Date) {

应该改为

void createBill(Date date) {

第 324 页:在上面的代码示例中,行 double chargeAmount = charge (lastBillDate, date) 应该改为 double chargeAmount = chargeFor (lastBillDate, date)。(我让方法名称与图表不一致。)[在第 8 版中已更正]

第 328 页:在动机段落中,“向下移动方法”应该改为“向下推方法”。(这是当我没有为所有内容使用链接时会发生的事情!)[在第 8 版中已更正]

第 333 页:“劳动力项目需要一些参数,而有些参数不需要”应该改为:“一些参数是需要的……”(缺少单词)[在第 5 版中已更正]

第 346 页:“每当我们看到两个类似的方法”应该改为:“每当我们看到两个类似的方法”[在第 5 版中已更正]

第 346 页:“statement 方法打印报表”应该改为:“statement 方法打印报表”[在第 5 版中已更正]

第 349 页:第一段应该以一个右括号结尾,以匹配第一行的左括号。[在第 15 版中已更正]

第 351 页:在 UML 图中,客户和报表之间的关系应该是依赖关系,而不是关联关系。

第 355 页:“动机”部分的第一行,“……用继承替换委托(355)”应该改为“用委托替换继承(352)”[在第 3 版中已更正]

第 363 页:此页面上对重构的引用是使用章节引用而不是通常的页面引用进行交叉引用的。更糟糕的是,提取类的章节应该是第 7 章。[在第 13 版中已更正]

第 366 页

第一次提到图 12.6 实际上应该指的是图 12.5

第 390 页:“……vivc.edu” 应该改为 “uiuc.edu” [在第 3 版中已更正]

第 405 页:右下角的最后一个框应该写着“Hello World”(而不是“out”)[在第 3 版中已更正]

第 405 页:程序的解析树应该写着“hello”(方法名)小写。[在第 3 版中已更正]

第 414 页:URL“compuserv” 中对 JUnit 的引用应该改为 “compuserve” [在第 3 版中已更正]

第 92 页的图 4.1 的更正版本。

corrected figure 4.1


非常感谢 Mike Anderson、Alex Aptekman、Beth Egan Bradtke、Greg Cohoon、George Cowan、Bruce Crawford、John Dale、Nick Dallet、Dion Dock、Jutta Eckstein、Raimar Falke、Paul Haahr、Akira Hirasawa、John Hollister、Heinz Kabutz、Bernd Kahlbrandt、Adam Kiezun、Bart Koestner、Jung-joon Kim、Mark Kinzie、Hamish Lawson、Hwijae Lee、Jaeik Lee、Marc Lepage、Ron Lusk、Chuck McKinnon、Rory Molinari、Anthon van der Neut、Jonas Nyrup、Orjan Petersson、Jon Reid、Oliver Rode、Gavin Scott、Patricia Shanahan、Pradyumn Sharma、Joel Smith、Ellen Spertus、Dawie Strauss、Frank Tip、Madhavi Tolety、Bill Wake 和 Hirohide Yazaki 指出并告知我这些错误。