Создавайте сеттеры, которые возвращают себя в 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.

Это патч, но он работает...

Ответ 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.