生成在Eclipse中返回self的setter

时间:2012-09-06 07:04:00

标签: java eclipse code-generation pojo

我想安装我的定制器,以便我可以将它们链接起来:

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

通常我使用Eclipse生成setter但不幸的是code template对于setter只允许我更改setter的主体,而不是签名。

完成上述操作最简单的方法是什么?除了搜索和替换+手动编辑? :)

8 个答案:

答案 0 :(得分:7)

我可以提供一种补丁,但不需要任何额外的安装。

转到窗口/首选项/ 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

这是一个补丁,但它有效......

答案 1 :(得分:6)

您可以使用编辑器/模板来实现此目的。要定义新模板,请打开“首选项”窗口,然后打开Java->编辑器 - >模板。 在此窗口中,您可以定义新模板并为其命名。例如:

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

给它起个名字,例如settr。然后,您可以在java代码中使用此模板,方法是键入“settr”,然后键入Ctrl-Space。

答案 2 :(得分:5)

您可以使用fluent-builders-generator plugin以您希望的方式生成setter。

答案 3 :(得分:1)

Notepad ++解决方案:

数据:

JavaType variableName;

搜索正则表达式:

(.*) (.*);

替换正则表达式

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

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

答案 4 :(得分:1)

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

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

我认为它的灵感来自当时的@paweloque answer。唯一的区别是添加了{$ Field}和$ {param},它们用于命名方法和参数,并在方法体中调用eclipse生成的真实setter。

模板的优点在于,您可以在填写模板的变量时使用自动填充功能和一些选项卡创建方法。

结果是这样的:

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

以下是在eclipse中设置的截图:

enter image description here

答案 5 :(得分:0)

对此我的两分钱,我(未使用)使用

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设置程序时可以使用它
    Source > Generate Getters and Setters...
    
  • 在编辑器中输入set<start-of-fieldname>并按Ctrl + Space并生成单个设置器时,可以使用它。

缺点:

  • 生成getter设置程序时,必须勾选生成注释。
  • 您必须删除行注释开始符Ctrl + F //并替换为空字符串。

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

答案 6 :(得分:0)

一种替代方法是使用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

答案 7 :(得分:0)

使用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),并将生成的代码与inputclass合并。如果存在的话,它将覆盖现有的设置器。

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