Создавайте сеттеры, которые возвращают себя в Eclipse
Я хочу, чтобы у меня были сеттеры, чтобы я мог их связать, например:
myPojo.setX(x).setY(y);
Обычно я создаю сеттеры с Eclipse, но, к сожалению, code template
для сеттеров позволяет мне изменять только тело сеттера, а не подпись.
Каким будет самый простой способ завершить это? Помимо поиска и замены + ручного редактирования?:)
Ответы
Ответ 1
Для этой цели вы можете использовать редактор/шаблоны. Чтобы определить новый шаблон, откройте окно "Настройки", затем "Java- > Editor- > Templates".
В этом окне вы можете определить новый шаблон и присвоить ему имя. Например:
public ${enclosing_type} setName(${argType} name) {
this.name = name;
return this;
}
Дайте ему имя, например. settr. Затем вы можете использовать этот шаблон в своем java-коде, набрав "settr", а затем Ctrl-Space.
Ответ 2
Я могу предложить своего рода патч, который, однако, не требует дополнительных установок.
Перейдите в Window/preferences/Java/Code Style/Code templates. Измените шаблон шаблона "setter body" следующим образом:
${field} = ${param};
return this;
Теперь, когда вы запускаете "сгенерировать геттеры и сеттеры", он создаст сеттер, например:
public void setMyField(String myField) {
this.myField = myField;
return this;
}
Это, очевидно, вызывает ошибку компиляции, потому что тип метода void
. Но вы можете нанести удар Ctrl-F
и заменить все "public void set" на public YourClassName set
.
Это патч, но он работает...
Ответ 3
Возможно, вы сможете использовать плагин для плавного создания-генератора-генератора для создания сеттеров так, как вы хотите.
Ответ 4
Решение Notepad ++:
Данные:
JavaType variableName;
Искать регулярное выражение:
(.*) (.*);
Заменить регулярное выражение
public JavaType with\2\(\1 p\2\) { this.\2 = p\2; return this; }
Вы должны вручную исправить имя метода, так как оно не заглавывает первую букву имени переменной.
Ответ 5
Я использую шаблон именования withField
с этим шаблоном
public ${enclosing_type} with${Field}(${argType} ${param}) {
set${Field}(${param});
return this;
}
Я думаю, что это было вдохновлено @paweloqueответом в то время. Единственными отличиями являются добавленные {$ Field} и $ {param}, которые используются для именования метода и аргументов и вызова реального установщика, сгенерированного eclipse в теле метода.
Что хорошего в шаблонах, так это то, что вы можете создавать свои методы с помощью автозаполнения и нескольких вкладок при заполнении переменных шаблона.
Результат примерно такой:
public Foo withBar(String bar)
{
setBar(bar);
return this;
}
Вот снимок экрана, чтобы настроить это в затмении:
![enter image description here]()
Ответ 6
Мои два цента на этом, я (мисс) использую
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
.
Ответ 7
В качестве альтернативы можно использовать 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
Ответ 8
С JavaForger вы можете использовать шаблон, как указано ниже, для генерации сеттеров. Это означает, что вам придется запускать метод 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>
Приведенный ниже код выполняет приведенный выше шаблон (setters.javat) для класса с именем "myClass.java" и объединяет сгенерированный код с входным классом. Он переопределит существующие сеттеры, если они существуют.
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.