1. Обзор
Иногда мы хотим скрыть возможность получить или установить значение поля в наших объектах. Но Lombok автоматически генерирует геттер/сеттер по умолчанию. В этом кратком руководстве мы покажем, как мы можем исключить геттеры и сеттеры из генерации Lombok. Подробный обзор библиотеки Project Lombok также доступен в разделе Introduction to Project Lombok .
Прежде чем продолжить, мы должны установить плагин Lombok в нашу IDE .
2. Зависимости
Во-первых, нам нужно добавить Lombok в наш файл pom.xml
:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
3. Поведение по умолчанию
Прежде чем мы углубимся в детали того, как пропустить генерацию геттеров и сеттеров, давайте рассмотрим поведение по умолчанию аннотаций, отвечающих за их генерацию .
3.1. Аннотации @ Getter
и @ Setter
Lombok предоставляет две аннотации доступа: @Getter
и @Setter
. Мы можем аннотировать каждое поле или просто отметить ими весь класс. Сгенерированные методы будут общедоступными
по умолчанию. Однако мы можем изменить уровень доступа на protected
, package или private
. Давайте посмотрим пример:
@Setter
@Getter
public class User {
private long id;
private String login;
private int age;
}
Мы можем использовать опцию delombok
из плагина в нашей IDE и увидеть сгенерированный Lombok код:
public class User {
private long id;
private String login;
private int age;
public long getId() {
return this.id;
}
public String getLogin() {
return this.login;
}
public int getAge() {
return this.age;
}
public void setId(long id) {
this.id = id;
}
public void setLogin(String login) {
this.login = login;
}
public void setAge(int age) {
this.age = age;
}
}
Как мы видим, все геттеры и сеттеры были созданы. Методы получения и установки для всех полей являются общедоступными, поскольку мы не указали уровень доступа ни для одного поля явно .
3.2. @ Аннотация данных
@Data
сочетает в себе функции нескольких других аннотаций, включая @Getter
и @Setter.
Таким образом, в этом случае методы доступа по умолчанию также будут сгенерированы как общедоступные
:
@Data
public class Employee {
private String name;
private String workplace;
private int workLength;
}
4. Пропуск геттера или сеттера с помощью AccessLevel.NONE
Чтобы отключить генерацию геттера/сеттера по умолчанию для определенного поля, мы должны использовать определенный уровень доступа:
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
Этот уровень доступа позволяет нам переопределить поведение аннотаций @Getter
, @Setter
или @Data
в классе . Чтобы переопределить уровень доступа, аннотируйте поле или класс явной аннотацией @Setter
или @Getter
.
4.1. Переопределение аннотаций @Getter
и @Setter
Давайте изменим AccessLevel
на NONE
в геттере для поля age
и в сеттере для поля id
:
@Getter
@Setter
public class User {
@Setter(AccessLevel.NONE)
private long id;
private String login;
@Getter(AccessLevel.NONE)
private int age;
}
Давайте делобок
этот код:
public class User {
private long id;
private String login;
private int age;
public long getId() {
return this.id;
}
public String getLogin() {
return this.login;
}
public void setLogin(String login) {
this.login = login;
}
public void setAge(int age) {
this.age = age;
}
}
Как мы видим, нет сеттера для поля id
и геттера для поля age
.
4.2. Переопределение аннотации @Data
Давайте посмотрим на другой пример, в котором мы меняем AccessLevel
на NONE
в классе с аннотацией @Data
:
@Data
public class Employee {
@Setter(AccessLevel.NONE)
private String name;
private String workplace;
@Getter(AccessLevel.NONE)
private int workLength;
}
Мы добавили явную аннотацию @Getter в поле
workLength
и явную аннотацию @Setter в поле
имени
. AccessLevel обоих средств
доступа имеет значение NONE
. Посмотрим код деломбка
:
public class Employee {
private String name;
private String workplace;
private int workLength;
public String getName() {
return this.name;
}
public String getWorkplace() {
return this.workplace;
}
public void setWorkplace(String workplace) {
this.workplace = workplace;
}
public void setWorkLength(int workLength) {
this.workLength = workLength;
}
}
Как мы и ожидали, наши явные настройки @Getter
и @Setter
переопределяют геттеры и сеттеры, сгенерированные аннотацией @Data
. Для поля имени не создается установщик, а для поля
workLength
не создается геттер .
5. Вывод
В этой статье мы рассмотрели, как исключить генерацию геттера и сеттера с помощью Lombok для определенных полей в наших объектах. Кроме того, мы видели примеры для аннотаций @Getter
, @Setter
и @Data
. Далее мы увидели код, сгенерированный Lombok для наших настроек аннотаций.
Как всегда, код доступен на GitHub .