[英]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時可以使用它。
缺點:
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.