Аннотации для работы с данными — @Value и @With
Аннотация @Value
Аннотация @Value используется для создания неизменяемых (immutable) объектов. Она объединяет функциональность нескольких аннотаций:
@Getter — генерирует геттеры для всех полей.
@AllArgsConstructor — генерирует конструктор со всеми параметрами.
@ToString — генерирует метод toString().
@EqualsAndHashCode — генерирует методы equals() и hashCode().
Все поля класса становятся final.
Пример использования:
Как это работает под капотом:
Генерация кода:
Lombok создает класс с final-полями, геттерами, конструктором, toString(), equals() и hashCode().
Пример сгенерированного кода:
Нюансы использования:
Класс становится неизменяемым: все поля final, сеттеры не генерируются.
Если нужно изменить значение поля, придется создавать новый объект.
Нельзя использовать @Value с @Setter или @Data, так как они конфликтуют.
Взаимодействие с другими аннотациями:
@Value можно комбинировать с @Builder, чтобы добавить поддержку паттерна Builder для создания объектов.
Нельзя использовать с @NoArgsConstructor, так как все поля final и должны быть инициализированы.
Аннотация @With
Аннотация @With генерирует методы для создания копии объекта с измененным значением одного поля. Это полезно для работы с неизменяемыми объектами.
Пример использования:
Как это работает под капотом
Генерация кода:
Lombok создает методы withFieldName() для каждого поля.
Пример сгенерированного кода:
Нюансы использования
@With работает только с final-полями, так как предназначен для неизменяемых объектов.
Если поле не final, Lombok выдаст предупреждение.
Можно использовать с @Value для создания полностью неизменяемых объектов.
Взаимодействие с другими аннотациями:
@With можно комбинировать с @Value, @Builder и другими аннотациями Lombok.
Нельзя использовать с @Data, так как @Data генерирует сеттеры, что противоречит идее неизменяемости.
#Java #Training #Spring #Lombok #With #Value
Аннотация @Value
Аннотация @Value используется для создания неизменяемых (immutable) объектов. Она объединяет функциональность нескольких аннотаций:
@Getter — генерирует геттеры для всех полей.
@AllArgsConstructor — генерирует конструктор со всеми параметрами.
@ToString — генерирует метод toString().
@EqualsAndHashCode — генерирует методы equals() и hashCode().
Все поля класса становятся final.
Пример использования:
import lombok.Value;
@Value
public class User {
String name;
int age;
}
Как это работает под капотом:
Генерация кода:
Lombok создает класс с final-полями, геттерами, конструктором, toString(), equals() и hashCode().
Пример сгенерированного кода:
public final class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "User(name=" + this.name + ", age=" + this.age + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
Нюансы использования:
Класс становится неизменяемым: все поля final, сеттеры не генерируются.
Если нужно изменить значение поля, придется создавать новый объект.
Нельзя использовать @Value с @Setter или @Data, так как они конфликтуют.
Взаимодействие с другими аннотациями:
@Value можно комбинировать с @Builder, чтобы добавить поддержку паттерна Builder для создания объектов.
Нельзя использовать с @NoArgsConstructor, так как все поля final и должны быть инициализированы.
Аннотация @With
Аннотация @With генерирует методы для создания копии объекта с измененным значением одного поля. Это полезно для работы с неизменяемыми объектами.
Пример использования:
import lombok.With;
@With
public class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
// Использование:
User user = new User("John", 30);
User newUser = user.withAge(31); // Создает новый объект с измененным возрастом
Как это работает под капотом
Генерация кода:
Lombok создает методы withFieldName() для каждого поля.
Пример сгенерированного кода:
public class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public User withName(String name) {
return this.name == name ? this : new User(name, this.age);
}
public User withAge(int age) {
return this.age == age ? this : new User(this.name, age);
}
}
Нюансы использования
@With работает только с final-полями, так как предназначен для неизменяемых объектов.
Если поле не final, Lombok выдаст предупреждение.
Можно использовать с @Value для создания полностью неизменяемых объектов.
Взаимодействие с другими аннотациями:
@With можно комбинировать с @Value, @Builder и другими аннотациями Lombok.
Нельзя использовать с @Data, так как @Data генерирует сеттеры, что противоречит идее неизменяемости.
#Java #Training #Spring #Lombok #With #Value