Генерация кода шаблона Builder в IntelliJ

есть ли способ автоматизировать написание шаблонов Builder в IntelliJ?

например, учитывая этот простой класс:

class Film {
   private String title;
   private int length;

   public void setTitle(String title) {
       this.title = title;
   }

   public String getTitle() {
       return this.title;
   }

   public void setLength(int length) {
       this.length = length;
   }

   public int getLength() {
       return this.length;
   }
}

есть ли способ, которым я мог бы заставить IDE генерировать это или подобное:

public class FilmBuilder {

    Film film;

    public FilmBuilder() {
        film = new Film();
    }

    public FilmBuilder withTitle(String title) {
        film.setTitle(title);
        return this;
    }

    public FilmBuilder withLength(int length) {
        film.setLength(length);
        return this;
    }

    public Film build() {
        return film;
    }
}

9 ответов


использовать заменить конструктор на Builder рефакторинг.

чтобы использовать эту функцию, щелкните подпись конструктора в коде, затем щелкните правой кнопкой мыши и выберите меню "рефакторинг", затем нажмите " заменить конструктор на Builder..."чтобы открыть диалоговое окно для создания кода.


Я нашел встроенное поколение шаблонов builder в IntelliJ немного неуклюжим по нескольким причинам:

  1. Он должен использовать существующий конструктор в качестве ссылки.
  2. он не быстро доступен через меню" Создать" (command+N на OS X).
  3. Он генерирует только внешние классы Builder. Как уже упоминалось, при реализации шаблона builder очень часто используются статические внутренние классы.

на InnerBuilder плагин устраняет все эти недостатки, и не требует установки или настройки. Вот пример компоновщика, сгенерированный плагином:

public class Person {
    private String firstName;
    private String lastName;
    private int age;

    private Person(Builder builder) {
        firstName = builder.firstName;
        lastName = builder.lastName;
        age = builder.age;
    }

    public static final class Builder {
        private String firstName;
        private String lastName;
        private int age;

        public Builder() {
        }

        public Builder firstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Builder lastName(String lastName) {
            this.lastName = lastName;
            return this;
        }

        public Builder age(int age) {
            this.age = age;
            return this;
        }

        public Person build() {
            return new Person(this);
        }
    }
}

вот как преодолеть недостатки упомянутые Мансур Сиддикуи:

1) он должен использовать существующий конструктор в качестве ссылки.

который очень легко генерировать. Нажмите Alt + Ins в Windows, чтобы вызвать меню Generate и выбрать Constructor.

2) он не быстро доступен через меню" Generate " (command+N на ОС X)

просто перейдите в Settings -> Keymap поиск Builder и назначьте ему ярлык по вашему выбору (Если вы используете эту функцию очень часто, что редко бывает). Вы можете назначить Alt + B например.

Другой альтернативой является Ctrl + Shift + A (Поиск Действия). Начните печатать Builder и вы немедленно получите доступ к команда:

Find Action dialog

вы можете использовать этот ярлык для быстрого доступа к любой функции IntelliJ IDEA (это очень помогает, когда вы точно не помните, что называется командой и где ее найти).

3) он генерирует только внешние классы Builder. Как упоминали другие, это очень распространено в использовании статические внутренние классы при реализации шаблона.

Я тоже предпочитаю своих строителей статичным внутренним классам. К сожалению, нет простого способа сделать это, но это все еще возможно. Вам просто нужно определить вложенный внутренний класс самостоятельно (оставьте его пустым), и когда вы вызываете Replace Constructor with Builder диалоговое окно выберите и выберите свой внутренний класс. Работает как шарм! Хотя, было бы проще сделать эту опцию настраиваемой.


Если вам интересно, можно ли использовать это для создания класса с внутренним классом builder как описано Джошуа блоком - вам просто нужно сначала определить пустой внутренний класс, затем проверить "использовать существующий" и найти свой новый созданный (внутренний класс) и нажать "рефакторинг".

PS! Курсор должен находиться внутри конструктора (предварительно написанного), чтобы использовать функцию рефакторинга "заменить конструктор на Builder".


IntelliJ способ к этому, ИМХО, запутан. Есть два плагина (я предпочитаю этот:https://plugins.jetbrains.com/plugin/7354), которые служат цели намного лучше.

например, я предпочитаю иметь класс Builder как внутренний класс PoJo. Для достижения этого с IntelliJ вам нужно несколько дополнительных штрихов.

еще одним плюсом плагина является расположение функций (в Generate... контекстное меню).


в дополнение к ответу @CrazyCoder, я думаю, что это очень полезно знать, что в верхней правой части заменить конструктор на Builder диалоговое окно существует кнопка конфигурации, которую можно использовать для переименования префикса сеттеров.


для тех, кто хочет заменить "слишком много параметров" шаблоном builder, сделайте "извлечь объект параметра", а затем преобразовать конструктор в builder, упомянутый в других ответах здесь.


создать конструктор класса, щелкнув правой кнопкой мыши на class Generate>Constructor. Затем в Windows нажмите Ctrl+Shift+A, чтобы найти действие и введите "builder", выберите "Замените конструктор на builder.."


на мой взгляд, самый простой способ получить внутренний статический класс вместо отдельного:

  1. Если у вас еще нет конструктора, создайте его с помощью создать диалоговое окно конструктор
  2. затем используйте заменить конструктор на Builder
  3. переместите вновь созданный класс обратно в исходный, используя шаг рефакторинга (Горячая Клавиша: F6)