在Eclipse中生成返回自身的setter

uubf1zoe  于 2022-11-04  发布在  Eclipse
关注(0)|答案(8)|浏览(188)

我想要我的二传手,这样我就可以链他们像:

myPojo.setX(x).setY(y);

通常我用Eclipse生成setter,但不幸的是,setter的code template允许我只修改setter的主体,而不修改签名。
除了搜索和替换+手动编辑之外,完成上述操作最简单的方法是什么?:)

gopyfrb3

gopyfrb31#

我可以提供一种补丁,但不需要任何额外的安装。
转到“窗口”/“首选项”/“Java”/“代码样式”/“代码模板”。编辑“setter body”模板,如下所示:

${field} = ${param};
return this;

现在,当你运行“generate getters and setters”时,它将创建如下的setter:

public void setMyField(String myField) {
    this.myField = myField;
    return this;
}

这显然会导致编译错误,因为方法类型是void。但您可以删除Ctrl-F,并将所有'public void set'替换为public YourClassName set
这是一个补丁,但它的工作...

new9mtju

new9mtju2#

您可以使用编辑器/模板来定义新模板。要定义新模板,请打开首选项窗口,然后选择Java-〉编辑器-〉模板。在此窗口中,您可以定义一个新模板并给予命名。例如:

public ${enclosing_type} setName(${argType} name) {
    this.name = name;
    return this;
}

给予它一个名称,例如setr。然后您可以在java代码中使用此模板,方法是键入'setr',然后按Ctrl-空格键。

pgx2nnw8

pgx2nnw83#

您也许可以使用fluent-builders-generator plugin以您想要的方式生成setter。

wyyhbhjk

wyyhbhjk4#

记事本++解决方案:
数据来源:

JavaType variableName;

搜索正则表达式:

(.*) (.*);

替换正则表达式

public JavaType with\2\(\1 p\2\) { this.\2 = p\2; return this; }

您必须手动更正方法名,因为它没有将变量名的第一个字母大写。

ccrfmcuu

ccrfmcuu5#

我在此模板中使用withField命名模式

public ${enclosing_type} with${Field}(${argType} ${param}) {
    set${Field}(${param});
    return this;
}

我认为它的灵感来自于@paweloque当时的answer,唯一的区别是增加了{$Field}和${param},它们用于命名方法和参数,并在方法体中调用eclipse生成的真实的的setter。
模板的优点在于,在填充模板变量时,可以使用自动完成功能和几个制表符来创建with方法。
结果是这样的:

public Foo withBar(String bar)
{
    setBar(bar);
    return this;
}

下面是在eclipse中进行设置的屏幕截图:

d5vmydt9

d5vmydt96#

我的两分钱就在这上面,我(小姐)用了

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 + Space时,可以在生成单个setter时使用它。

缺点:

  • 在生成getter setter时,必须勾选generate注解。
  • 您必须移除行注解起始字符Ctrl + F//,并以空字串取代。

不幸的是,我找不到一种方法来大写字段名称的第一个字母,这将使使用前缀,如with可能。

2admgd59

2admgd597#

一种替代方法是使用Lombok's @Setter and @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
kadbb459

kadbb4598#

在JavaForger中,你可以使用下面给出的模板来生成setter,这意味着你必须为每个类运行一个main方法来生成getter和setter。

<#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>

下面的代码为一个名为“www.example.com“的类执行上面的模板(setters.javat)myClass.java,并将生成的代码与inputclass合并。它将覆盖现有的setter(如果存在的话)。

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

相关问题