Какие есть способы избежать написания геттеров и сеттеров в Java вручную?

«Какие есть способы избежать написания геттеров и сеттеров в Java вручную?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Есть несколько способов автоматизировать создание геттеров и сеттеров, чтобы избежать boilerplate-кода.

1. Lombok (наиболее популярный) Использует аннотации, которые обрабатываются на этапе компиляции.

import lombok.Getter;
import lombok.Setter;
import lombok.AccessLevel;

@Getter // Создаст геттеры для всех полей
@Setter // Создаст сеттеры для всех не-final полей
public class User {
    private String name;
    @Setter(AccessLevel.PROTECTED) // Кастомизация: сеттер только с protected доступом
    private int age;
    private final String id; // Для final поля сеттер создан не будет
}

2. Records (Java 14+) Создают неизменяемые (immutable) классы-носители данных. Геттеры генерируются автоматически (но называются не getName(), а просто name()).

public record User(String name, int age) {}
// Автоматически создаются: конструктор, методы name(), age(), equals(), hashCode(), toString()
// Сеттеры отсутствуют, так как record неизменяем.

3. Kotlin Data Classes (для Kotlin-проектов)

data class User(val name: String, var age: Int)
// Для val генерируется только геттер, для var — и геттер, и сеттер.

4. IDE Generation Большинство IDE (IntelliJ IDEA, Eclipse) могут сгенерировать геттеры/сеттеры по шаблону, но код все равно будет присутствовать в исходниках.

Рекомендация: Для стандартных mutable-классов в Java-проектах используйте Lombok. Для неизменяемых DTO предпочтительны Records.