Java for Beginner
743 subscribers
709 photos
199 videos
12 files
1.15K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Введение в Lombok и базовые аннотации

Всем привет!

Сегодня мы начинаем серию постов, посвященных библиотеке Lombok. Если вы устали писать boilerplate-код (геттеры, сеттеры, toString, equals и т.д.), то Lombok — это то, что вам нужно! Давайте разберемся, что это за библиотека и как она может упростить вашу жизнь.


Что такое Lombok и зачем он нужен?

Lombok — это библиотека для Java, которая помогает сократить объем шаблонного кода. Она автоматически генерирует методы, такие как геттеры, сеттеры, toString(), equals(), hashCode() и другие, во время компиляции. Это делает код более чистым и удобным для чтения.

Пример без Lombok:
public class User {
private String name;
private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}


Пример с Lombok:
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class User {
private String name;
private int age;
}
Lombok убирает необходимость писать шаблонный код, что особенно полезно в больших проектах.



Установка Lombok в проект

Maven (проверяйте версии в библиотеке Maven):

Добавьте зависимость в pom.xml:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.36</version>
<scope>provided</scope>
</dependency>


Gradle:
Добавьте зависимость в build.gradle:
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.36'
annotationProcessor 'org.projectlombok:lombok:1.18.36'
}


Аннотация @Getter и @Setter

Эти аннотации автоматически генерируют геттеры и сеттеры для всех полей класса.


Пример:
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
private String name;
private int age;
}


Как это работает:
Lombok генерирует методы getName(), setName(), getAge(), setAge() во время компиляции. Эти методы добавляются в байт-код, но не отображаются в исходном коде.


Нюансы:
Можно применять аннотации к отдельным полям, если не нужно генерировать методы для всех полей.

Уровень доступа методов можно изменить с помощью параметра AccessLevel:
@Getter(AccessLevel.PROTECTED)
private String name;


Аннотация @ToString

Эта аннотация автоматически генерирует метод toString(), который возвращает строковое представление объекта.

Пример:
import lombok.ToString;

@ToString
public class User {
private String name;
private int age;
}


Как это работает:
Lombok генерирует метод toString(), который выглядит примерно так:
@Override
public String toString() {
return "User(name=" + this.name + ", age=" + this.age + ")";
}


Нюансы:
Можно исключить поля из toString() с помощью параметра exclude:
@ToString(exclude = "age")
public class User {
private String name;
private int age;
}


Можно включить только определенные поля с помощью параметра of:
@ToString(of = "name")
public class User {
private String name;
private int age;
}


#Java #Training #Spring #Lombok #Getter #Setter #ToString
👍4
Основы ООП в Java

Глава 2. Инкапсуляция

Геттеры и сеттеры. Инкапсуляция как интерфейс класса

Геттеры и сеттеры — это специальные методы, которые предоставляют контролируемый доступ к приватным полям класса. Они являются инструментом для реализации инкапсуляции на практике.

Геттеры (Getters): Методы для чтения значения поля. Они возвращают значение и обычно называются getFieldName() (например, getName()).
Сеттеры (Setters): Методы для записи значения в поле. Они принимают параметр и обычно называются setFieldName() (например, setName(String name)). В сеттерах можно добавить проверки для обеспечения валидности данных.

Это позволяет скрыть поля (private), но дать внешнему коду возможность работать с ними безопасно.

Пример класса с геттерами и сеттерами:
public class Person {
private String name; // Скрытое поле
private int age; // Скрытое поле

// Геттер для name
public String getName() {
return name;
}

// Сеттер для name
public void setName(String name) {
if (name != null && !name.isEmpty()) {
this.name = name;
} else {
System.out.println("Имя не может быть пустым!");
}
}

// Геттер для age
public int getAge() {
return age;
}

// Сеттер для age с проверкой
public void setAge(int age) {
if (age > 0 && age < 150) {
this.age = age;
} else {
System.out.println("Некорректный возраст!");
}
}
}

Здесь поля private, так что внешний код не может напрямую сказать person.name = "Invalid";.
Сеттеры добавляют логику: проверка на пустоту или диапазон, что сохраняет целостность объекта.



Инкапсуляция как интерфейс класса

Инкапсуляция превращает класс в "капсулу" с четким интерфейсом — набором публичных методов (включая геттеры и сеттеры), которые определяют, как внешний код может взаимодействовать с объектом. Интерфейс класса — это как API: он показывает, что можно делать, но скрывает как.

Интерфейс через геттеры/сеттеры: Внешний код видит только методы, такие как getAge() или setName(), а не внутренние данные. Это делает класс "черным ящиком": вы можете изменить реализацию (например, хранить возраст в днях), но интерфейс остается тем же, и внешний код не сломается.

Преимущества как интерфейса:
Гибкость: Изменения внутри класса не влияют на пользователей.
Контроль: Сеттеры позволяют валидировать входные данные, геттеры — форматировать выход (например, вернуть возраст как строку).
Безопасность: Скрытие предотвращает прямой доступ к чувствительным данным.


Пример использования:
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("Алексей"); // Через сеттер
person.setAge(35); // Через сеттер с проверкой

System.out.println("Имя: " + person.getName()); // Имя: Алексей
System.out.println("Возраст: " + person.getAge()); // Возраст: 35

person.setAge(-5); // Вывод: Некорректный возраст! (поле не изменится)
}
}

Внешний код работает только через интерфейс, что обеспечивает инкапсуляцию.



Как создать это в IntelliJ IDEA

Генерация геттеров/сеттеров:

В классе Person выделите поля.
Правой кнопкой → Generate →
Getter and Setter.
Выберите поля и сгенерируйте методы — IntelliJ добавит их автоматически.


Тестируйте:

Создайте Main, добавьте код и запустите.


Полезные советы для новичков

Конвенции имен: Всегда используйте get/set + имя поля с большой буквы (CamelCase).
Добавляйте логику: В сеттерах проверяйте вход (if-else), в геттерах — форматируйте (например, добавить единицы измерения).
Избегайте публичных полей: Даже если кажется проще — это нарушает инкапсуляцию.
Автоматизация: В IDE генерируйте геттеры/сеттеры, чтобы сэкономить время.
Ресурсы: Почитайте о "JavaBeans" — стандарте, где геттеры/сеттеры играют ключевую роль.



#Java #для_новичков #beginner #incapsulation #setter #getter
👍4