Ответ
Lombok — это библиотека-процессор аннотаций, которая генерирует шаблонный код (boilerplate) во время компиляции, сокращая объем написанного вручную кода.
Часто используемые аннотации и их действие:
| Аннотация | Генерируемый код |
|---|---|
@Getter / @Setter |
Геттеры и сеттеры для полей. |
@ToString |
Реализация toString(). |
@EqualsAndHashCode |
Реализация equals() и hashCode(). |
@NoArgsConstructor |
Конструктор без аргументов. |
@AllArgsConstructor |
Конструктор со всеми полями. |
@RequiredArgsConstructor |
Конструктор для final и @NonNull полей. |
@Data |
Комбинация: @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor. |
@Builder |
Реализация паттерна Builder для удобного создания объектов. |
@Slf4j / @Log4j2 |
Внедрение логгера. |
Пример класса:
@Data // Геттеры, сеттеры, toString, equals, hashCode, конструктор для final полей
@Builder // Паттерн Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE) // Скрытый конструктор
public class User {
private Long id;
@NonNull
private String name;
private String email;
}
// Использование Builder:
User user = User.builder().id(1L).name("John").email("john@example.com").build();
Преимущества: Значительное сокращение кода, улучшение читаемости, снижение вероятности ошибок в шаблонных методах.
Недостатки и особенности:
- Требует плагина в IDE для "видимости" сгенерированных методов.
- Усложняет отладку, так как сгенерированный код не отображается в исходниках.
- Может конфликтовать с другими библиотеками, генерирующими код (например, MapStruct).
- Аннотация
@Dataгенерирует сеттеры для всех полей, что может нарушить инкапсуляцию для immutable-объектов. В таких случаях лучше использовать комбинацию@Value(для immutable) или отдельные аннотации.