Генерация сеттеров, которые возвращают себя в Eclipse
Я хотел бы иметь мои сеттеры, чтобы я мог связать их как:
myPojo.setX(x).setY(y);
Обычно я генерирую сеттеры с Eclipse, но, к сожалению, code template
для сеттеров позволяет мне менять только тело сеттера, а не подпись.
Каков будет самый простой способ завершить вышеописанное? Помимо поиска и замены + ручное редактирование?:)
6 ответов
Я могу предложить своего рода патч, который, однако, не требует каких-либо дополнительных установок.
Перейдите в Окно / Настройки /Java/ Стиль кода / Шаблоны кода. Отредактируйте шаблон "setter body" следующим образом:
${field} = ${param};
return this;
Теперь, когда вы запустите "генерировать геттеры и сеттеры", он создаст сеттер как
public void setMyField(String myField) {
this.myField = myField;
return this;
}
Это, очевидно, вызывает ошибку компиляции, потому что тип метода void
, Но вы можете ударить Ctrl-F
и заменить все "публичные пустые наборы" на public YourClassName set
,
Это патч, но он работает...
Вы можете использовать редактор / шаблоны для этой цели. Чтобы определить новый шаблон, откройте окно настроек, затем Java->Editor->Templates. В этом окне вы можете определить новый шаблон и дать ему имя. Например:
public ${enclosing_type} setName(${argType} name) {
this.name = name;
return this;
}
Дайте ему имя, например, поселенец. Затем вы можете использовать этот шаблон в своем Java-коде, набрав "урегулирование", а затем Ctrl-пробел.
Вы можете использовать плагин 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;
// }
Выгода:
Он может быть использован при генерации геттеров сеттеров с использованием
Source > Generate Getters and Setters...
Может использоваться при генерации одного сеттера при вводе в редакторе
set<start-of-fieldname>
и ударCtrl
+Space
,
Недостатки:
- Вы должны отметить создание комментариев при создании методов получения.
- Вы должны удалить начальный комментарий строки,
Ctrl
+F
//
и заменить на пустую строку.
К сожалению, я не смог найти способ заглавной буквы первой буквы имени поля, которая была бы сделана с использованием префикса, такого как with
возможный.
Я использую withField
шаблон именования с этим шаблоном
public ${enclosing_type} with${Field}(${argType} ${param}) {
set${Field}(${param});
return this;
}
Я думаю, что это было вдохновлено paweloque в то время. Единственными отличиями являются добавленные {$Field} и ${param}, которые используются для именования метода и аргументов и вызова реального установщика, сгенерированного eclipse в теле метода.
Что хорошего в шаблонах, так это то, что вы можете создавать свои методы with, используя автозаполнение и несколько вкладок при заполнении переменных шаблона.
Результат примерно такой:
public Foo withBar(String bar)
{
setBar(bar);
return this;
}
Вот скриншот, чтобы настроить это в затмении:
Одной из альтернатив будет использование @Setter и @Getter от Lombok. 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
Решение Notepad++:
Данные:
JavaType variableName;
Поиск регулярного выражения:
(.*) (.*);
Заменить регулярное выражение
public JavaType with\2\(\1 p\2\) { this.\2 = p\2; return this; }
Вы должны вручную исправить имя метода, так как оно не заглавными буквами первой буквы имени переменной.
С помощью JavaForger вы можете использовать приведенный ниже шаблон для создания установщиков. Это означает, что вам придется запускать основной метод для каждого класса, для которого вы хотите сгенерировать геттеры и сеттеры.
<#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>
Приведенный ниже код выполняет указанный выше шаблон (setters.javat) для класса с именем "myClass.java" и объединяет сгенерированный код с 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.