как создать конструктор используя lombok
а для чего нужны эти несколько конструкторов? может воспользоваться @Builder на классом(можно и над конструктором), код будет Student s = Strudent.builder().firstName(«alex»).lastName(«Alex2»).build(); , можно комбинировать нужные параметры как хочется.
13 апр 2020 в 19:50
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Просто объявите нужные вам поля (firstName и age) как final и добавьте на класс аннотацию @RequiredArgsConstructor.
Если вы хотите и такой конструктор (с параметрами firstName и age), и ещё с тремя параметрами — проще тот, который с тремя, написать самому, благо в IDE такая операция, как генерация конструктора, занимает пару секунд.
Отслеживать
ответ дан 13 апр 2020 в 17:38
56 2 2 бронзовых знака
т.е. получается, что с помощью lombook я могу объявить только один конструктор? А если будет 7 полей у класса, и конструкторов 5, тогда нет смысла один прятать, а 4 дописывать руками
13 апр 2020 в 18:00
ты можешь ломбоком создать конструктор по-умолчанию (@NoArgsConstructor), со всеми аргументами (@AllArgsConstructor) и с аргументами для инициализации только final полей. Если тебе нужно что-то еще, пиши сам конструкторы
Lombok
Lombok — это библиотека для сокращения кода в классах и расширения функциональности языка Java. Подключается к среде разработки (IDE) или инструменту сборки приложений Maven, Gradle в качестве плагина.

Освойте профессию «Java-разработчик»
Библиотека получила название в честь индонезийского острова Ломбок, расположенного недалеко от острова Ява. В переводе с индонезийского Lombok означает «перец чили»: по аналогии с приправой, библиотека призвана повысить качество Java-кода.
Зачем нужен Lombok в Java
Java — один из популярных языков, но у него есть несколько недостатков. Один из них — необходимость написания шаблонного кода для геттеров, сеттеров, метода toString() и так далее. Например, Kotlin и Scala также работают поверх JVM, но не нуждаются в шаблонном коде. Это причина их растущей популярности. Использование Lombok позволяет автоматически преобразовать объемный Java-код в оптимизированную и лаконичную структуру, характерную для перечисленных языков.
Также плагин избавляет разработчика от ручного набора однотипных фрагментов кода и предотвращает появление ошибок.
Профессия / 14 месяцев
Java-разработчик
Освойте востребованный язык

Как работает Lombok
Принцип работы библиотеки основан на использовании аннотаций, которые:
- многократно сокращают шаблонный код;
- экономят время разработчиков;
- улучшают читаемость кода.
Сравним «чистый» Java-код и код, оптимизированный с помощью библиотеки Lombok.
| Обычный Java-код | Код, использующий аннотации Lombok |
|---|---|
| public class Employee private Integer employeeId; private String name; private String company; private String emailId; public Employee() <> public Employee(Integer employeeId, String name, String company, String emailId) super(); this.employeeId = employeeId; this.name = name; this.company = company; this.emailId = emailId; > public Integer getEmployeeId() return employeeId; > public void setEmployeeId(Integer employeeId) this.employeeId = employeeId; > public String getName() return name; > public void setName(String name) this.name = name; > public String getCompany() return company; > public void setCompany(String company) this.company = company; > public String getEmailId() return emailId; > public void setEmailId(String emailId) this.emailId = emailId; > @Override public String toString() return «Employee [» + «employeeId=» + employeeId + «, name=» + name + «, » + » company=» + company + «, emailId=» + emailId + «]»; > > |
import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; @NoArgsConstructor @AllArgsConstructor @ToString @Getter @Setter public class Employee private Integer employeeId; private String name; private String company; private String emailId; > |
Использование Lombok сокращает код в три раза.


Станьте Java-разработчиком
и создавайте сложные сервисы
на востребованном языке
Аннотации в Lombok
Наиболее полезные аннотации в библиотеке:
- @Getter и @Setter — предоставляют геттеры и сеттеры для поля. Могут использоваться как на уровне поля, так и на уровне класса.
- @NoArgsConstructor — используется для создания конструктора без аргументов.
- @AllArgsConstructor — генерирует параметризованный конструктор, который принимает один параметр для каждого поля и инициализирует их с его помощью. Аннотация необходима, если нужно создать объект класса, передав начальные значения полей в конструктор.
- @ToString — переопределяет метод toString() и создает для него реализацию по умолчанию. Она выводит имя класса и поля по порядку, разделяя их запятыми. Можно пропустить отдельные поля, если аннотировать их с помощью @ToString.Exclude.
- @EqualsAndHashCode — применяется для переопределения методов equals() и hashCode().
- @Data — объединяет аннотации @ToString, @Getter, @Setter, @EqualsAndHashCode и @RequiredArgsConstructor в одну. Предоставляет весь код, который обычно используется в классах моделей, например, геттеры для всех полей, сеттеры для всех нефинальных полей, реализацию по умолчанию для toString(), equals() и hashCode(), а также конструктор, который инициализирует все поля класса.
Java-разработчик
Java уже 20 лет в мировом топе языков программирования. На нем создают сложные финансовые сервисы, стриминги и маркетплейсы. Освойте технологии, которые нужны для backend-разработки, за 14 месяцев.

Статьи по теме:
Allargsconstructor java что это
Проект Lombok создан для уменьшения шаблонного (boilerplate) кода.
Ведь часто в классе нам требуется писать геттеры, сеттеры и конструкторы. С помощью Lombok можно этот процесс автоматизировать и генерировать код на этапе сборки проекта.
При этом кода на этапе разработки не существует. Чтобы среда разработки понимала, что код будет в дальнейшем существовать, необходимо настроить проект для работы с Lombok.
А ещё Lombok — это название острова в составе Индонезии, недалеко от острова Ява.
️ Требования #
Для подключения Lombok ваш проект должен использовать:
- Java >= 1.8
- Maven 3.6.x (Gradle >= 4)
Также все действия будут проводиться в среде разработки IntelliJ IDEA.
Добавление зависимостей в проект #
В примере будет показан проект с использованием Maven и среды разработки IntelliJ IDEA.
Добавьте в pom.xml зависимость:
org.projectlombok lombok 1.18.24 provided
Область видимости provided говорит, что в результирующем артефакте библиотеки Lombok не будет. Lombok на этапе сборки создаст код, и больше для работы приложения он будет не нужен.
Установите версию Java в pom.xml, в секцию properties . В таком случае Maven будет использовать данную версию для компиляции проекта, если значение не установлено, по умолчанию будет использоваться версия 1.5.
11 11
Примените изменения pom.xml, для этого используйте горячие клавиши: Ctrl+Shift+O / ⌘ ⇧ I или обновите через контекстное меню папки проекта во вкладке Project и выберите Maven -> Reload project .
Если у вас версия IDEA выше 2020.3, то вам не требуется устанавливать дополнительные плагины. Плагин Lombok уже встроен в среду разработки.
В противном случае установите плагин Lombok из магазина плагинов в настройках IDEA.
▶️ Использование #
На примере нескольких аннотаций посмотрим, какие возможности даёт Lombok.
@Getter, @Setter #
Нам часто приходиться создавать геттеры и сеттеры для полей класса. Lombok может освободить от ручного создания таких методов и генерировать их при сборке проекта.
Если мы бы писали класс без использования Lombok:
public class Person private String name; private int age; public String getName() return name; > public void setName(String name) this.name = name; > public int getAge() return age; > public void setAge(int age) this.age = age; > >
Добавив над классов аннотации @Getter , @Setter мы получим точно такие же сеттеры, названия методов по умолчанию формируется по соглашению getИмяПеременной , setИмяПеременной .
@Getter @Setter public class Person private String name; private int age; >
Сеттеры генерируются только для не final полей, геттеры — для всех полей.
@NoArgsConstructor, @AllArgsConstructor #
Таким же образом мы можем генерировать конструкторы класса. Допустим, нашему классу необходимы два конструктора: без аргументов и со всеми аргументами. Без Lombok мы напишем это так:
@Getter @Setter public class Person private String name; private int age; public Person() > public Person(String name, int age) this.name = name; this.age = age; > >
Добавив над классом аннотацию @NoArgsConstructor , мы получим для класса сгенерированный пустой конструктор:
@Getter @Setter @NoArgsConstructor public class Person private String name; private int age; public Person(String name, int age) this.name = name; this.age = age; > >
При использовании аннотации @AllArgsConstructor Lombok создаст конструктор для всех полей класса, аргументы будут располагаться в порядке объявления полей внутри класса:
@Getter @Setter @NoArgsConstructor @AllArgsConstructor public class Person private String name; private int age; >
Используя этот конструктор, мы напишем такую строку создания объекта Person:
Person person = new Person("Alex", 34);
@ToString #
Для переопределения метода toString() у класса также можно использовать Lombok. Аннотация на классом @ToString переопределит метод и сформирует строку из всех полей класса и имени класса.
Например, если мы добавим к нашему классу Person аннотацию @ToString:
@Getter @Setter @NoArgsConstructor @AllArgsConstructor @ToString public class Person private String name; private int age; >
и после создадим объект и распечатаем его,
Person person = new Person("Alex", 34); System.out.println(person);
то получим в консоли строку:
Person(name=Alex, age=34)
Не все поля нам нужны для toString() , и мы можем часть исключить. Для этого у аннотации есть дополнительный параметр exclude , в котором мы можем прописать список полей, не участвующих в формировании строки. Это полезно, когда нам надо скрыть чувствительные данные: пароли, персональные данные, которые могут попасть в логи или консоль.
@Getter @Setter @NoArgsConstructor @AllArgsConstructor @ToString(exclude = "age">) public class Person private String name; private int age; >
И уже при печати не будет данных поля age:
Person(name=Alex)
У других аннотаций также есть дополнительные параметрами, с которыми при необходимости ознакомитесь в документации к Lombok.
@Data #
Есть аннотации, которые включают в себя другие аннотации. Это позволяет не писать множество аннотаций над классом, так как такие наборы аннотаций часто повторяются и @Data позволяет нам одной строкой добавить к классу:
- @ToString
- @Getter
- @Setter
- @RequiredArgsConstructor — конструктор для полей с модификатором final,
- @EqualsAndHashCode — формирование методов equals() и hashCode() из всех полей
Для примера заменим часть аннотаций в Person на @Data :
@Data @NoArgsConstructor @AllArgsConstructor public class Person private String name; private int age; >
Кода становится меньше, но если нам требуется настроить более тонко одну из аннотаций, входящих в состав @Data , то необходимо её написать отдельно — например, чтобы исключить поля из toString() .
@Data @NoArgsConstructor @AllArgsConstructor @ToString(exclude = "age">) public class Person private String name; private int age; >
Lombok — Java: Классы
В Java разработчики часто сталкиваются с необходимостью написания повторяющегося шаблонного кода. К таким элементам относятся конструкторы, геттеры и сеттеры. Это может приводить к значительному увеличению объема кода, особенно в больших проектах.
Рассмотрим класс Post . Он содержит пять полей, включающих стандартные конструкторы и методы доступа. Это типичный пример шаблонного кода, который встречается во многих классах.
import java.time.LocalDate; public class Post private Long id; private Long authorId; private String slug; private String name; private String body; private LocalDate createdAt; // Конструктор по умолчанию public Post() > // Конструктор со всеми полями public Post(Long id, Long authorId, String slug, String name, String body, LocalDate createdAt) this.id = id; this.authorId = authorId; this.slug = slug; this.name = name; this.body = body; this.createdAt = createdAt; > public Long getId() return id; > public void setId(Long id) this.id = id; > public Long getAuthorId() return authorId; > public void setAuthorId(Long authorId) this.authorId = authorId; > public String getSlug() return slug; > public void setSlug(String slug) this.slug = slug; > public String getName() return name; > public void setName(String name) this.name = name; > public String getBody() return body; > public void setBody(String body) this.body = body; > public LocalDate getCreatedAt() return createdAt; > public void setCreatedAt(LocalDate createdAt) this.createdAt = createdAt; > >
Мы еще не написали ничего полезного, но класс уже занимает больше 70 строк. А что будет когда у нас будет 20 полей или 30? Для прикладного кода это вполне нормально. При этом самих классов сотни и тысячи. Некоторых разработчиков такая ситуация устраивает, так как редактор сам генерирует весь нужный код, но некоторые все равно хотели бы избавиться от шаблонного кода и даже не генерировать его.
Решение с Lombok
Сама Java не позволяет так сделать, но позволяет Lombok . Lombok – это библиотека, которая позволяет убрать шаблонный код при создании классов. Возьмем класс из примера выше и перепишем его с использованием Lombok. Вот что у нас получится.
import java.time.LocalDate; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class Post private Long id; private Long authorId; private String slug; private String name; private String body; private LocalDate createdAt; >
Размер класса сократился до примерно 10 строк, хотя то что мы получили – это всего лишь визуальное сокращение кода. Во время исполнения этот код будет заменен на обычный класс Java со всеми нужными методами.
Самое необычное в коде выше это блок кода над классом:
import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter @NoArgsConstructor @AllArgsConstructor
То, что мы здесь видим, называется аннотациями. Аннотации в Java это тоже код. Аннотации бывают у классов, методов и даже параметров методов. Они начинаются с символа @ за которым идет имя аннотации. Аннотации могут сопровождаться параметрами в стиле, похожем на вызов функций.
@Annotation(key=value) // определение какого-нибудь класса
То что мы увидели выше, называется аннотациями класса. Встречаются и другие аннотации, привязанные к свойствам, методам и даже параметрам методов. Со временем мы разберемся со всеми видами и будем их активно использовать в своем коде не только в связке с Lombok.
Сами по себе аннотации на код никак не влияют. Аннотации лишь добавляют информацию к классу, которую затем может прочитать и использовать другой код. В нашем случае это будет делать плагин Lombok для Gradle, который подключается к проекту таким образом:
plugins id("io.freefair.lombok") version "8.4" >
Lombok встраивается в процесс компиляции, во время которой он «наполняет» классы необходимыми методами. Из-за этого, помимо gradle-плагина, для поддержки Lombok понадобится добавить плагин в используемый редактор. Подробнее установка Lombok описана на официальном сайте .
За что отвечает каждая аннотация выше?
- @Getter : Генерирует стандартные геттеры для всех полей класса.
- @Setter : Генерирует стандартные сеттеры для всех полей класса.
- @NoArgsConstructor : Генерирует пустой конструктор. Используется только тогда, когда определен хотя бы один не пустой конструктор.
- @AllArgsConstructor : Генерирует конструктор со всеми полями. Поля в конструкторе перечислены в том же порядке, в котором они определены в классе.
@ToString
@toString еще одна полезная аннотация, которая генерирует метод toString() добавляя в него все не статические поля класса.
import lombok.ToString; @ToString // Остальные аннотации public class User private String name; private int age; private String email; >
Использование и вывод:
var user = new User("John Doe", 30, "john.doe@example.com"); System.out.println(user); // => User(name=John Doe, age=30, email=john.doe@example.com)
@EqualsAndHashCode
Аннотация @EqualsAndHashCode генерирует методы equals() и hashCode() соответственно. По умолчанию, в эти методы включаются все не статические поля класса. Пример с пользователем.
import lombok.EqualsAndHashCode; @EqualsAndHashCode // Остальные аннотации public class Person private String name; private int age; private String email; >
var person1 = new Person("John Doe", 30, "john.doe@example.com"); var person2 = new Person("John Doe", 30, "john.doe@example.com"); System.out.println(person1.equals(person2)); // true System.out.println(person1.hashCode()); // hashCode of person1 System.out.println(person2.hashCode()); // hashCode of person2 (идентичен с person1)
Если поведение необходимо изменить, то @EqualsAndHashCode позволяет это сделать описав те поля, которые нужно явно включить или исключить. Предположим что мы хотим сравнивать пользователей только на основе email, тогда код примет следующий вид:
@EqualsAndHashCode(onlyExplicitlyIncluded = true) public class Person private String name; private int age; @EqualsAndHashCode.Include
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях: