Allargsconstructor java что это
Перейти к содержимому

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 @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

Эти три аннотации генерируют конструктор, который принимает 1 параметр для определённых полей и просто присваивает этот параметр полю.

@NoArgsConstructor генерирует конструктор без параметров. Если это невозможно (потому что поля final), то возникает ошибка компиляции. Если используется @NoArgsConstructor(force = true), то все final поля инициализируются 0 / false / null. Для полей с ограничениями, например @NotNull, никаких проверок при присвоении не генерируется, поэтому эти условия могут не выполняться, пока эти поля не будут инициализированы подобающим образом позже. Определённые Java-конструкции, например Hibernate и Service Provider Interface требуют наличия конструктора без аргументов. Эта конструкция используется главным образом вместе с @Data или одной из других аннотаций, генерирующих конструктор.

@RequiredArgsConstructor генерирует конструктор с 1 параметром для каждого поля, которое требует специальной обработки. Все неинициализированные final поля получают параметр, также как все остальные поля, помеченные @NonNull, которые не иницилизированы при объявлении. Для этих случаев также генерируется явная проверка на null. Конструктор бросает исключение NullPointerException, если какой-либо из параметров, предназначенный для полей, помеченных @NonNull содержит null. Порядок этих параметров совпадает с порядком появления полей в классе.

@AllArgsConstructor генерирует конструктор с одним параметром для каждого поля в классе. Поля, помеченные @NonNull, имеют проверку на null для этих параметров.

Каждая из этих аннотаций имеет альтернативную форму, где сгенерированный конструктор всегда приватный, и генерируется дополнительный статический фабричный метод, оборачивающий этот конструктор. Этот режим включается с помощью параметра staticName в аннотации, например: @ RequiredArgsConstructor ( staticName = «of» ) . Такой статический метод выводит шаблоны в отличие от нормального конструктора. Это означает, что пользователи вашего API смогут писать MapEntry . of ( «foo» , 5 ) , вместо new MapEntry < String , Integer >( «foo» , 5 ) .

Для того чтобы добавить аннотации к сгенерированным конструкторам, вы можете использовать onConstructor = @__ ( < @AnnotationsHere >) , но будьте осторожны, так как это экспериментальная возможность.

Статические поля пропускаются этими аннотациями. Также аннотация @java.beans.ConstructorProperties добавляется ко всем конструкторам, у которых хотя бы один аргумент, что позволяет утилитам редактирования вызывать сгенерированные конструкторы. @ConstructorProperties сейчас находится в Java 1.6, что означает, что если ваш код будет компилироваться в Java 1.5, то возникнет ошибка компиляции. Запуск на JVM 1.5 должен проходить без проблем (аннотация игнорируется). Чтобы подавить генерацию аннотации @ConstructorProperties, добавьте параметр к вашим аннотациям: @AllArgsConstructor ( suppressConstructorProperties = true ) . Однако как только Java 1.5, время время которой уже прошло, уйдёт в забвение, этот параметр будет удалён. Поэтому он помечен как устаревший.

В отличие от большинства других аннотаций Lombok, существование явного конструктора не предотвращает генерацию этими аннотациями своих собственных конструкторов. Это означает, что вы можете написать свой специализированный конструктор, и позволить Lombok сгенерировать свои как положено. Если возникнет конфликт (один из ваших конструкторов заканчивается той же сигнатурой,что и сгенерированный Lombok), то возникнет ошибка компиляции.

С использованием Lombok

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

Constructors made to order: Generates constructors that take no arguments, one argument per final / non-null field, or one argument for every field.

Overview

This set of 3 annotations generate a constructor that will accept 1 parameter for certain fields, and simply assigns this parameter to the field.

@NoArgsConstructor will generate a constructor with no parameters. If this is not possible (because of final fields), a compiler error will result instead, unless @NoArgsConstructor(force = true) is used, then all final fields are initialized with 0 / false / null . For fields with constraints, such as @NonNull fields, no check is generated,so be aware that these constraints will generally not be fulfilled until those fields are properly initialized later. Certain java constructs, such as hibernate and the Service Provider Interface require a no-args constructor. This annotation is useful primarily in combination with either @Data or one of the other constructor generating annotations.

@RequiredArgsConstructor generates a constructor with 1 parameter for each field that requires special handling. All non-initialized final fields get a parameter, as well as any fields that are marked as @NonNull that aren’t initialized where they are declared. For those fields marked with @NonNull , an explicit null check is also generated. The constructor will throw a NullPointerException if any of the parameters intended for the fields marked with @NonNull contain null . The order of the parameters match the order in which the fields appear in your class.

@AllArgsConstructor generates a constructor with 1 parameter for each field in your class. Fields marked with @NonNull result in null checks on those parameters.

Each of these annotations allows an alternate form, where the generated constructor is always private, and an additional static factory method that wraps around the private constructor is generated. This mode is enabled by supplying the staticName value for the annotation, like so: @RequiredArgsConstructor(staticName=»of») . Such a static factory method will infer generics, unlike a normal constructor. This means your API users get write MapEntry.of(«foo», 5) instead of the much longer new MapEntry(«foo», 5) .

To put annotations on the generated constructor, you can use onConstructor=@__() , but be careful; this is an experimental feature. For more details see the documentation on the onX feature.

Static fields are skipped by these annotations.

Unlike most other lombok annotations, the existence of an explicit constructor does not stop these annotations from generating their own constructor. This means you can write your own specialized constructor, and let lombok generate the boilerplate ones as well. If a conflict arises (one of your constructors ends up with the same signature as one that lombok generates), a compiler error will occur.

With Lombok

import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.NonNull;

@RequiredArgsConstructor ( staticName = «of» )
@AllArgsConstructor ( access = AccessLevel.PROTECTED )
public class ConstructorExample <
private int x, y;
@NonNull private T description;

@NoArgsConstructor
public static class NoArgsExample <
@NonNull private String field;
>
>

Vanilla Java

public class ConstructorExample <
private int x, y;
@NonNull private T description;

private ConstructorExample ( T description ) <
if ( description == null ) throw new NullPointerException ( «description» ) ;
this .description = description;
>

public static ConstructorExample of ( T description ) <
return new ConstructorExample ( description ) ;
>

@java.beans.ConstructorProperties (< "x" , "y" , "description" >)
protected ConstructorExample ( int x, int y, T description ) <
if ( description == null ) throw new NullPointerException ( «description» ) ;
this .x = x;
this .y = y;
this .description = description;
>

public static class NoArgsExample <
@NonNull private String field;

public NoArgsExample () <
>
>
>

Supported configuration keys:

lombok.anyConstructor.addConstructorProperties = [ true | false ] (default: false ) If set to true , then lombok will add a @java.beans.ConstructorProperties to generated constructors. lombok. [ allArgsConstructor | requiredArgsConstructor | noArgsConstructor ] .flagUsage = [ warning | error ] (default: not set) Lombok will flag any usage of the relevant annotation ( @AllArgsConstructor , @RequiredArgsConstructor or @NoArgsConstructor ) as a warning or error if configured. lombok.anyConstructor.flagUsage = [ warning | error ] (default: not set) Lombok will flag any usage of any of the 3 constructor-generating annotations as a warning or error if configured. lombok.copyableAnnotations = [A list of fully qualified types] (default: empty list) Lombok will copy any of these annotations from the field to the constructor parameter, the setter parameter, and the getter method. Note that lombok ships with a bunch of annotations ‘out of the box’ which are known to be copyable: All popular nullable/nonnull annotations. lombok.noArgsConstructor.extraPrivate = [ true | false ] (default: false) If true , lombok will generate a private no-args constructor for any @Value or @Data annotated class, which sets all fields to default values (null / 0 / false).

Small print

Even if a field is explicitly initialized with null , lombok will consider the requirement to avoid null as fulfilled, and will NOT consider the field as a ‘required’ argument. The assumption is that if you explicitly assign null to a field that you’ve also marked as @NonNull signals you must know what you’re doing.

The @java.beans.ConstructorProperties annotation is never generated for a constructor with no arguments. This also explains why @NoArgsConstructor lacks the suppressConstructorProperties annotation method. The generated static factory methods also do not get @ConstructorProperties , as this annotation can only be added to real constructors.

@XArgsConstructor can also be used on an enum definition. The generated constructor will always be private, because non-private constructors aren’t legal in enums. You don’t have to specify AccessLevel.PRIVATE .

Various well known annotations about nullity cause null checks to be inserted and will be copied to the parameter. See Getter/Setter documentation’s small print for more information.

The flagUsage configuration keys do not trigger when a constructor is generated by @Data , @Value or any other lombok annotation.

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

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