簡體   English   中英

在 Eclipse 中生成返回 self 的設置器

[英]Generate setters that return self in Eclipse

我想要我的二傳手,這樣我就可以像這樣鏈接它們:

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

通常我使用 Eclipse 生成設置器,但不幸的是設置器的code template允許我只更改設置器的主體,而不是簽名。

完成上述內容的最簡單方法是什么? 除了搜索和替換+手動編輯? :)

您可以使用編輯器/模板來實現此目的。 要定義新模板,請打開“首選項”窗口,然后打開Java->編輯器 - >模板。 在此窗口中,您可以定義新模板並為其命名。 例如:

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

給它起個名字,比如settr。 然后,您可以在java代碼中使用此模板,方法是鍵入“settr”,然后鍵入Ctrl-Space。

我可以提供一種補丁,但不需要任何額外的安裝。

轉到窗口/首選項/ 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替換所有'public void set'。

這是一個補丁,但它的工作原理......

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

Notepad ++解決方案:

數據:

JavaType variableName;

搜索正則表達式:

(.*) (.*);

替換正則表達式

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

您必須手動更正方法名稱,因為它不會大寫變量名稱的第一個字母。

我在這個模板中使用withField命名模式

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

我認為它的靈感來自@paweloque當時回答 唯一的區別是添加了{$ Field}和$ {param},它們用於命名方法和參數,並在方法體中調用eclipse生成的真實setter。

模板的優點在於,您可以在填寫模板變量時使用自動完成和一些選項卡創建方法。

結果是這樣的:

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

這是一個在eclipse中設置的屏幕截圖:

在此輸入圖像描述

我的兩分錢,我(小姐)使用了

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時,您必須勾選生成注釋。
  • 您必須刪除行注釋啟動器, Ctrl + F //並替換為空字符串。

不幸的是,我無法找到一個方法來大寫使用前綴,如將做字段名的第一個字母with可能的。

另一種方法是使用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

使用 JavaForger,您可以使用下面給出的模板來生成設置器。 這確實意味着您必須為要為其生成 getter 和 setter 的每個 class 運行一個主要方法。

<#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”的 class 執行上面的模板 (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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM