在Eclipse中自动生成类的构建器

51

有没有一种方法可以使用自动构建器来为Eclipse中的类创建构建器(Joshua Bloch的Builder模式)?例如菜单中的选项、插件或其他内容。我在"重构"下没有找到任何东西。


1
快速谷歌搜索“eclipse插件生成器模式”给我带来了(其中之一)https://code.google.com/p/fluent-builders-generator-eclipse-plugin/。 - Dirk Lachowski
1
@Dirk - 我不喜欢你的回答。不能对评论进行踩,但我虚拟地给你打上 -1。也许你不应该仅仅因为 Google 找到了一个链接就感到满意。我尝试过 Fluent Builder Generator,它已经十年没有更新了,并且生成的代码比漂亮简单的构建器要复杂得多。 - Honza Zidek
@HonzaZidek,我认为你误解了我的评论的重点。OP没有展示出自己寻找答案的努力。我只是想指出一个事实,一些简单的谷歌搜索就给了我答案(复数形式,这就是为什么我写了“among others”)。我知道“这里有一个链接”不是一个答案——这就是为什么我把它放在了评论中。也许我最好投票关闭…… - Dirk Lachowski
1
@HonzaZidek 这不是一个 Eclipse 插件,但或许你想试一下:https://github.com/mkarneim/pojobuilder - Dirk Lachowski
1
@Sridhar-Sarnobat 实际上有一个错误报告,隐藏在 Bugzilla 中: https://bugs.eclipse.org/bugs/show_bug.cgi?id=458364 - Pyves
显示剩余5条评论
5个回答

29

你可能想查看 Lombok 注解来生成没有样板代码的构造器。例如:

@Builder
public class MyPojo {
    private String name;
}

MyPojoBuilder.builder().name("yourame").build();

但是这个方法好像不能用于抽象类。


1
非常感谢您向我推荐这个优秀的项目,我之前从未见过。这解决了我的问题,并简化了生成样板代码时的一些麻烦 :). - Carsten Hoffmann
2
令人印象深刻的功能。不知道为什么 Lombok 不受欢迎? - Basil Musa
1
我在寻找Lombok的替代方案时发现了这个答案,因为@Builder注释仍然(截至2017年4月)不能用于由父类提供的成员(如Jaco所述)。 - 8bitjunkie
6
@BasilMusa,无论lombok是否流行,你都应该阅读“Project Lombok有哪些风险?”(https://dev59.com/cW455IYBdhLWcg3wAvRI)和“使用Project Lombok是否安全?”(https://dev59.com/gW865IYBdhLWcg3wYNVS)。请注意,这两篇文章仅供参考,你需要仔细评估使用Lombok的风险和利益。 - inor

23

也许我来晚了。

Eclipse本身没有提供一种生成支持构建器模式的代码的方法。但是可以通过插件扩展其功能。

有一个插件我使用过:

https://github.com/henningjensen/bpep

编辑:5年后重新访问这个话题,我建议使用已成为行业标准并且IDE不可知的 lombok ==> 如果您的团队成员使用各种IDE,则会起作用。 请查看此注释。 您还可以在类之间包括模式继承

@Builder(toBuilder = true)
// or you could use this for inheritance
@SuperBuilder

很不幸,Google Code即将关闭,因此这个链接可能在几个月内失效。这个项目是否在其他地方可用? - Tagir Valeev
很遗憾,这个插件似乎不再起作用了。它创建了一个构建器,但似乎无法列出字段。 - Florian Schaetz
@FlorianSchaetz:我刚在Eclipse Mars上尝试了一下,对我来说可以工作。 - Khanna111
@Khanna111,我也遇到了同样的问题。使用Eclipse Luna。 - Vivek Goel
2
我在Eclipse Neon.2 Release (4.6.2)上使用了这个插件,它可以正常工作。此外,这个插件有一个优点,就是不需要注释。 - hasanghaforian
显示剩余2条评论

17

1
是的,Spark构建器非常好用。而且它有很多选项,比如舞台构建器。你可以看一下。 - Christian

3

试试看 https://github.com/vojtek/write-it-once

package ${cls.package.name};

public class ${cls.shortName}Builder {

public static ${cls.name}Builder builder() {
    return new ${cls.name}Builder();
}
<% for(field in cls.fields) {%>
private ${field.type.name} ${field.name};
<% } %>
<% for(field in cls.fields) {%>
public ${cls.name}Builder ${field.name}(${field.type.name} ${field.name}) {
    this.${field.name} = ${field.name};
    return this;
}
<% } %>
public ${cls.name} build() {
    final ${cls.name} data = new ${cls.name}();
<% for(field in cls.fields) {%>
    data.${field.setter.name}(this.${field.name});
<% } %>
    return data;
}
}

这是一个非常简单的解决方案 - 创建一个带有模板的独立项目,并从主项目中生成Java类。 - Atmega

2
您可以在“窗口” -> “首选项” -> “Java” -> “编辑器” -> “模板”中添加自己的模板。这将随内容建议一起激活,但不会由重构操作激活。

5
我认为你不能为生成器模式编写模板。即使它有效,这也是一个不好的主意,因为模板无法更新,你必须手动删除代码并重新应用模板。 - Carsten Hoffmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接