我想要我的二传手,这样我就可以像这样链接它们:
myPojo.setX(x).setY(y);
通常我使用 Eclipse 生成设置器,但不幸code template
的是设置器只允许我更改设置器的主体,而不是签名。
完成上述内容的最简单方法是什么?除了搜索和替换+手动编辑?:)
我想要我的二传手,这样我就可以像这样链接它们:
myPojo.setX(x).setY(y);
通常我使用 Eclipse 生成设置器,但不幸code template
的是设置器只允许我更改设置器的主体,而不是签名。
完成上述内容的最简单方法是什么?除了搜索和替换+手动编辑?:)
我可以提供一种不需要任何额外安装的补丁。
转到窗口/首选项/Java/代码样式/代码模板。编辑“setter body”模板如下:
${field} = ${param};
return this;
现在,当您运行“生成 getter 和 setter”时,它将创建像这样的 setter:
public void setMyField(String myField) {
this.myField = myField;
return this;
}
这显然会导致编译错误,因为方法类型是void
. 但是您可以Ctrl-F
将所有“公共无效集”替换为public YourClassName set
.
这是一个补丁,但它可以工作......
您可以为此目的使用编辑器/模板。要定义新模板,请打开 Preferences Window,然后 Java->Editor->Templates。在此窗口中,您可以定义一个新模板并为其命名。例如:
public ${enclosing_type} setName(${argType} name) {
this.name = name;
return this;
}
给它一个名字,例如settr。然后,您可以通过键入“settr”然后按 Ctrl-Space 在您的 Java 代码中使用此模板。
您也许可以使用fluent-builders-generator 插件以您想要的方式生成设置器。
我的两分钱,我(错过)使用
Preferences > Java > Code Style > Code Templates > Comments > Setter
并在那里放置以下模板:
/**
* @param ${param} the ${bare_field_name} to set
*/
// public ${enclosing_type} ${bare_field_name}(${field_type} ${param}) {
// ${enclosing_method}(${param});
// return this;
// }
益处:
它可以在使用生成 getter setter 时使用
Source > Generate Getters and Setters...
set<start-of-fieldname>
当在编辑器中键入并点击Ctrl
+时生成单个 setter 时可以使用它Space
。
缺点:
Ctrl
+F
//
并替换为空字符串。不幸的是,我找不到将字段名称的第一个字母大写的方法,这将使用诸如with
可能的前缀。
我withField
在这个模板中使用命名模式
public ${enclosing_type} with${Field}(${argType} ${param}) {
set${Field}(${param});
return this;
}
我认为这是受到@paweloque 当时的回答的启发。唯一的区别是添加的 {$Field} 和 ${param} 用于命名方法和参数,并在方法体中调用 eclipse 生成的真实 setter。
模板的优点在于,您可以在归档模板变量的同时使用自动完成功能和一些选项卡创建您的 with 方法。
结果是这样的:
public Foo withBar(String bar)
{
setBar(bar);
return this;
}
这是在 Eclipse 中进行设置的屏幕截图:
记事本++解决方案:
数据:
JavaType variableName;
搜索正则表达式:
(.*) (.*);
替换正则表达式
public JavaType with\2\(\1 p\2\) { this.\2 = p\2; return this; }
您必须手动更正方法名称,因为它不会大写变量名称的第一个字母。
使用 JavaForger,您可以使用下面给出的模板来生成设置器。这确实意味着您必须为要为其生成 getter 和 setter 的每个类运行一个 main 方法。
<#list fields as field>
/**
* Sets the ${field.name} of the {@link ${class.name}}.
*
* @param ${field.name} The input {@link ${field.nonPrimitiveType}}.
*/
public ${class.name} ${field.setter}(${field.type} ${field.name}) {
this.${field.name} = ${field.name};
return this;
}
</#list>
下面的代码为一个名为“myClass.java”的类执行上面的模板(setters.javat),并将生成的代码与输入类合并。如果存在,它将覆盖现有的设置器。
JavaForgerConfiguration config = JavaForgerConfiguration.builder()
.withTemplate("setters.javat")
.withMergeClassProvider(ClassProvider.fromInputClass(s -> s))
.withOverride(true)
.build();
JavaForger.execute(config, "myClass.java");
您必须添加“setters.javat”的位置:
StaticJavaForgerConfiguration.addTemplateLocation("my/location/");
该项目可以在这里找到:https ://github.com/daanvdh/JavaForger 。
一种替代方法是使用Lombok 的 @Setter 和 @Getter。Lombok 基于一些注释在编译时增强了你的类。它在命令行上运行良好,并且具有 Eclipse 支持。
@Getter @Setter
public class Point {
int x, y;
static void test() {
new Point().setX(1).setY(2);
}
}
并在lombok.config
:
lombok.accessors.chain=true