Строитель шаблон генерации кода в 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;
}
}
614   9  

9 ответов:

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

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

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

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

The 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 " (команда+N на ОС X)

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

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

Find Action dialog

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

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.