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器模式生成有点笨重,原因如下:
- 它需要使用现有的构造函数作为参考。
- 不能通过“生成”菜单(OS X上的
command+N
)快速访问。 - 它只生成外部的生成器类。 正如其他人所提到的,在实现构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构造器..”