Генерация сеттеров, которые возвращают себя в 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.

Другие вопросы по тегам