
# 用构建器替换构造函数
通过此重构，可以将类构造函数的用法替换为对构建器类的引用。
#### 执行重构
1. 在代码编辑器中，将光标放置在要将其调用替换为对构建器类的引用的类构造器的声明上。
2. 单击右键展示上下文菜单，选择**"重构 \> 用构建器替换构造函数"**。
3. 在打开的**"用构建器替换构造函数"** 对话框中，提供重构参数。
   
   - 选择是创建新的生成器类还是使用现有的生成器类。
   
   - 提供构建器类名，如果创建新类，则提供其包名和目标目录。
   
   - 在**"要传递给构建器的参数"** 选项，配置作为生成器类字段传递的构造函数参数。如果指定的字段的默认值与作为构造函数参数传递的值匹配，则可以选中"可选的Setter"复选框跳过此类参数的setter方法。否则，如果未选中复选框，则始终调用字段设置器。
     如下图所示：
     图1用构建器替换构造函数   
     ![](https://support.huaweicloud.com/usermanual-codeartside/zh-cn_image_0000002385622357.png "点击放大") 
   
   
   
   
4. 单击**"重构"**以应用重构。
 
#### 示例
例如，用对新创建的**InnerClass** 构建器类的引用替换**InnerClassBuilder** 调用。请注意，由于将*"* **Hello** "和"**World** "作为**Hello** 和**World** 生成器类字段的默认值，因此可以使用**可选的Setter** 选项，以便在**InnerClassBuilder** 调用中跳过对**setHello** 和**s** **etWorld**的调用。
**重构前**
"com\\refactoring\\source\\ReplaceConstructor.java"文件内容如下：
```
class ReplaceConstructor {
   public static void main(String[] args) {
      new InnerClass("Hello", "World").print();
   }
   private static class InnerClass {
      private String message;
      public InnerClass(String hello, String world) {
         message = hello + ", " + world;
      }
      public void print() {
         System.out.println(message);
      }
   }
}
```
**重构后**
"com\\refactoring\\source\\ReplaceConstructor.java"文件内容如下：
```
class ReplaceConstructor1 {
    public static void main(String[] args) {
        new InnerClassBuilder().setHello("Hello").setWorld("World").createInnerClass().print();
    }
    static class InnerClass {
        private String message;
        public InnerClass(String hello, String world) {
            message = hello + ", " + world;
        }
        public void print() {
            System.out.println(message);
        }
    }
}
```
同时，生成"com\\refactoring\\source\\InnerClassBuilder.java"文件，文件内容如下：
```
package com.refactoring.source;
public class InnerClassBuilder {
    private String hello;
    private String world;
    public InnerClassBuilder setHello(String hello) {
        this.hello = hello;
        return this;
    }
    public InnerClassBuilder setWorld(String world) {
        this.world = world;
        return this;
    }
    public ReplaceConstructor1.InnerClass createInnerClass() {
        return new ReplaceConstructor1.InnerClass(hello, world);
    }
}
```
