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

Пропуск геттера или сеттера в Ломбоке

· 4 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

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 .