IntelliJ构build器模式代码生成

有什么办法可以在IntelliJ中自动编写生成器模式?

例如,给这个简单的类:

class Film { private String title; private int length; public void setTitle(String title) { this.title = title; } public String getTitle() { return this.title; } public void setLength(int length) { this.length = length; } public int getLength() { return this.length; } } 

有没有一种方法可以让IDE生成这个或类似的:

 public class FilmBuilder { Film film; public FilmBuilder() { film = new Film(); } public FilmBuilder withTitle(String title) { film.setTitle(title); return this; } public FilmBuilder withLength(int length) { film.setLength(length); return this; } public Film build() { return film; } } 

使用Builder重构replace构造函数 。

要使用这个函数,在代码中点击构造函数的签名,然后右键单击并select“Refactor”菜单,然后点击“Replace Constructor with Builder …”打开对话框生成代码。

我发现IntelliJ中内置的构build器模式生成有点笨重,原因如下:

  1. 它需要使用现有的构造函数作为参考。
  2. 不能通过“生成”菜单(OS X上的command+N )快速访问。
  3. 它只生成外部的生成器类。 正如其他人所提到的,在实现构build器模式时,使用静态内部类是非常常见的。

InnerBuilder插件解决了所有这些缺点,不需要安装或configuration。 这是一个由插件生成的示例Builder:

 public class Person { private String firstName; private String lastName; private int age; private Person(Builder builder) { firstName = builder.firstName; lastName = builder.lastName; age = builder.age; } public static final class Builder { private String firstName; private String lastName; private int age; public Builder() { } public Builder firstName(String firstName) { this.firstName = firstName; return this; } public Builder lastName(String lastName) { this.lastName = lastName; return this; } public Builder age(int age) { this.age = age; return this; } public Person build() { return new Person(this); } } } 

如果您想知道是否可以使用Joshua Block所描述的方法创build一个带有内部构build器类的类 – 那么您只需要首先定义一个空的内部类,然后选中“Use existing”并search新创build的(内部类)并点击“重构”。

PS! 游标必须驻留在构造函数(预先写好的)中,以便使用“使用Builderreplace构造函数”重构函数。

以下是如何克服Mansoor Siddiqui提到的缺点 :

1)它需要使用现有的构造函数作为参考。

这很容易生成。 只需在Windows上按Alt + Ins即可调用“生成”菜单并select“ Constructor

2)通过“生成”菜单不能快速访问(OS X上的命令+ N)

只需进入Settings -> Keymap ,searchBuilder并为其分配一个你select的快捷方式(如果你经常使用这个function,很less有这种情况)。 例如,您可以分配Alt + B。

另一种select是Ctrl + Shift + A (查找操作)。 开始inputBuilder ,你会立即得到访问命令:

查找操作对话框

你可以使用这个快捷方式来快速访问任何IntelliJ IDEAfunction(当你不记得命令被调用到什么地方以及在哪里可以find它时,这会有很大的帮助)。

3)它只生成外部的生成器类。 正如其他人所提到的,在实现构build器模式时,使用静态内部类是非常常见的。

我也喜欢我的build设者作为静态的内部类。 不幸的是,没有简单的方法去做,但它仍然是可行的。 您只需自己定义嵌套的内部类(将其保留为空),并在调用“ Replace Constructor with Builder对话框时,select“ Use existing选项”并select内部类。 奇迹般有效! 虽然,使这个选项可configuration会更容易。

IntelliJ的方式是,恕我直言,是错综复杂的。 那里有两个插件(我更喜欢这个: https : //plugins.jetbrains.com/plugin/7354 ),目的是好得多。

例如,我更喜欢将Builder类作为PoJo的内部类。 为了实现IntelliJ,你需要一些额外的冲程。

插件的另一个优点是function的位置(在“ Generate...上下文菜单中)。

作为@ CrazyCoder答案的一个补充,我认为知道在Replace Builder with Builder对话框的右上angular有一个configurationbutton,可以用来重命名setter的前缀,这非常有用。

对于那些想用构build器模式replace“太多参数”的用户,先执行“提取参数对象”,然后将构造器转换为其他答案中提到的构build器。

通过右键单击类Generate> Constructor来生成类的构造函数。 然后,在Windows上,按下Ctrl + Shift + A来查找操作并键入“builder”,select“用构build器replace构造器..”