как создать конструктор используя 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 месяцев.

Статьи по теме:
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 студентов
Наши выпускники работают в компаниях:
Аннотации. Часть вторая. Lombok

Аннотации. Часть первая, немного скучная В этой части я решил затронуть библиотеку Lombok как известного представителя Source аннотаций. С Runtime аннотациями в следующей статье. Жил был java программист, каждый день он писал обычный код, например такой:
package lombok; public class Chelovek < private String name; private int age; public Chelovek(String name, int age) < this.name = name; this.age = age; >public Chelovek() < >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; >@Override public boolean equals(Object o) < if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Chelovek chelovek = (Chelovek) o; if (age != chelovek.age) return false; return name != null ? name.equals(chelovek.name) : chelovek.name == null; >@Override public int hashCode() < int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; >@Override public String toString() < return "Chelovek package lombok; @Data public class Chelovek

Да это все. Прикольно? Что сделает аннотация @Data? Она на этапе компиляции сгенерирует геттеры\сеттеры для всех полей, toString и переопределит equals и hashCode по стандартам. В IDE можно установить плагин и он будет видеть все ещё не созданные методы. Надеюсь тут тебе, читатель, стало интересно, потому что дальше будет коротка вводная и ссылки на подробности. Ломбок так же предоставляет возможность кастомизировать генерацию, не всегда же нужны все геттеры, сеттеры или хешкод надо генерировать по-другому. Поэтому есть отдельные аннотации (думаю, многие из них в описании не нуждаются) @Getter/@Setter @ToString @EqualsAndHashCode @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor @Log Это самые типичные, весь набор можно посмотреть тут Особого внимания достойный var и val. Это возможность писать так:
package lombok; import lombok.experimental.var; @Data public class Chelovek < private String name; private int age; public static void main(String[] args) < var chelovek = new Chelovek(); chelovek.setAge(22); System.out.println(chelovek); >>
Зачем это нужно? Например у нас есть класс RandomAccessFileChannel Ну, зачем нам писать так:
RandomAccessFileChannel channel = new RandomAccessFileChannel();
Если можно так:
var channel2 = new RandomAccessFileChannel();
На мой взгляд, это не всегда приемлемо. Например, у нас есть злой метод, возвращающий злую мапу:
public static Map>, Set>> evilMap()< return new HashMap<>(); >
если вызывать его так:
Map>, Set>> listSetMap = evilMap();
То более менее понятно с чем мы работаем. Если же вызов такой:
var listSetMap = evilMap();
то хрен знает, что там возвращает evilMap(), и пока не посмотришь в сам метод, не узнаешь. А зачем бегать по исходникам? В общем, с этим надо быть аккуратнее. Экспериментальная ветка: Тут хочу отметить аннотации: @UtilityClass Она создает приватный конструктор и там бросает exception (чтоб ручки грязные от рефлексии не лезли сюда). И очень красиво в начале класса сообщает нам, что тут утилитные методы. @Delegate Реализует шаблон делегирования. Если у тебя есть класс, который что-то делегирует другому классу, при этом вносит изменения только в некоторые методы, эта аннотация избавит тебя от дублирования методов + будет следить за ними. Если метод удалили или добавили, она это заметит. Ветка экспериментальных аннотаций GITHUB Официальный сайт Для того, чтобы IDE нормально работала с lombok, и не подчеркивала методы как несуществующие, надо установить плагин. На официальном сайте, есть раздел setup в котором можно посмотреть как подключить плагин для каждой IDE Как можно заметить ломбок популярен. >5000 звезд и >1000 форков. Спринг в своих классах использует ломбок. Если у тебя в проекте есть спринг, поищи, возможно, он подтянул ломбок, просто ты не в курсе.