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

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)

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

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

Java-университет

Аннотации. Часть первая, немного скучная В этой части я решил затронуть библиотеку 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

Аннотации. Часть вторая. Lombok - 1

Да это все. Прикольно? Что сделает аннотация @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 форков. Спринг в своих классах использует ломбок. Если у тебя в проекте есть спринг, поищи, возможно, он подтянул ломбок, просто ты не в курсе.

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

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