Перейти к содержимому

Allargsconstructor java что это

  • автор:

как создать конструктор используя 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-разработчик

Освойте востребованный язык

Group 1321314345 (4)

Как работает 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

Наиболее полезные аннотации в библиотеке:

  1. @Getter и @Setter — предоставляют геттеры и сеттеры для поля. Могут использоваться как на уровне поля, так и на уровне класса.
  2. @NoArgsConstructor — используется для создания конструктора без аргументов.
  3. @AllArgsConstructor — генерирует параметризованный конструктор, который принимает один параметр для каждого поля и инициализирует их с его помощью. Аннотация необходима, если нужно создать объект класса, передав начальные значения полей в конструктор.
  4. @ToString — переопределяет метод toString() и создает для него реализацию по умолчанию. Она выводит имя класса и поля по порядку, разделяя их запятыми. Можно пропустить отдельные поля, если аннотировать их с помощью @ToString.Exclude.
  5. @EqualsAndHashCode — применяется для переопределения методов equals() и hashCode().
  6. @Data — объединяет аннотации @ToString, @Getter, @Setter, @EqualsAndHashCode и @RequiredArgsConstructor в одну. Предоставляет весь код, который обычно используется в классах моделей, например, геттеры для всех полей, сеттеры для всех нефинальных полей, реализацию по умолчанию для toString(), equals() и hashCode(), а также конструктор, который инициализирует все поля класса.

Java-разработчик

Java уже 20 лет в мировом топе языков программирования. На нем создают сложные финансовые сервисы, стриминги и маркетплейсы. Освойте технологии, которые нужны для backend-разработки, за 14 месяцев.

картинка (67)

Статьи по теме:

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 студентов

Наши выпускники работают в компаниях:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *