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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Это прям жестоко как-то 🤣👍

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
January 16
Создание кастомных аннотаций с использованием Lombok

Lombok позволяет создавать кастомные аннотации, которые объединяют несколько аннотаций Lombok в одну. Это полезно, если вы часто используете одни и те же комбинации аннотаций.

Пример создания кастомной аннотации

Шаг 1: Создайте аннотацию:
import lombok.Value;
import lombok.With;
import lombok.experimental.Accessors;

@Value
@With
@Accessors(fluent = true)
public @interface ImmutableUser {
}


Шаг 2: Используйте аннотацию:
@ImmutableUser
public class User {
String name;
int age;
}


Результат:
Класс User будет иметь все функциональности
@Value, @With и @Accessors(fluent = true).

Как это работает под капотом

Компиляция Java-кода:
Когда вы компилируете код, Lombok анализирует кастомную аннотацию и применяет все аннотации, которые она объединяет.

Генерация кода:
Lombok генерирует код для каждой аннотации, указанной в кастомной аннотации.
Например, для @ImmutableUser будет сгенерирован код для @Value, @With и @Accessors(fluent = true).

Нюансы использования кастомных аннотаций

Ограничения:
Кастомные аннотации могут объединять только аннотации Lombok.
Нельзя использовать кастомные аннотации для добавления новой функциональности, только для комбинирования существующей.

Взаимодействие с другими аннотациями:
Кастомные аннотации можно комбинировать с другими аннотациями Lombok.
Например, можно добавить
@Builder к кастомной аннотации:

@Value
@With
@Builder
public @interface ImmutableUserWithBuilder {
}


Проблемы:

Если кастомная аннотация объединяет конфликтующие аннотации (например, @Value и @Data), это вызовет ошибку компиляции.
Убедитесь, что все аннотации в кастомной аннотации совместимы друг с другом.


#Java #Training #Spring #Lombok #CustomAnnotation
January 16
Аннотации Lombok для работы с ресурсами, делегированием и утилитарными классами

Аннотация @Cleanup

Аннотация @Cleanup автоматически закрывает ресурсы, такие как потоки, сокеты или соединения с базой данных, после их использования. Это избавляет от необходимости вручную вызывать метод close().

Пример использования:
import lombok.Cleanup;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class FileService {
public void readFile(String path) throws IOException {
@Cleanup InputStream inputStream = new FileInputStream(path);
// Использование inputStream
}
}


Как это работает под капотом:
Lombok оборачивает использование ресурса в блок try-finally и вызывает метод close() в блоке finally.

Сгенерированный код:
public void readFile(String path) throws IOException {
InputStream inputStream = new FileInputStream(path);
try {
// Использование inputStream
} finally {
if (inputStream != null) {
inputStream.close();
}
}
}


Нюансы использования:
Ресурс должен реализовывать интерфейс java.io.Closeable или java.lang.AutoCloseable.
Если метод close() выбрасывает исключение, оно будет подавлено (если не указано иное).


Аннотация @Delegate

Аннотация @Delegate позволяет делегировать вызовы методов другому объекту. Это полезно для реализации паттерна "делегирование" вместо наследования.

Пример использования:
import lombok.experimental.Delegate;

public class UserService {
@Delegate
private final UserRepository userRepository = new UserRepository();

// Дополнительные методы
}


Как это работает под капотом:
Lombok генерирует методы, которые делегируют вызовы к указанному объекту.

Сгенерированный код:
public class UserService {
private final UserRepository userRepository = new UserRepository();

public void save(User user) {
userRepository.save(user);
}

public User findById(Long id) {
return userRepository.findById(id);
}
}


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

Если класс реализует несколько интерфейсов, можно указать, какие из них делегировать:
@Delegate(types = {UserRepository.class, AnotherInterface.class})


Аннотация @UtilityClass

Аннотация @UtilityClass создает утилитарный класс, в котором все методы и поля становятся статическими, а конструктор — приватным.

Пример использования:
import lombok.experimental.UtilityClass;

@UtilityClass
public class StringUtils {
public boolean isEmpty(String str) {
return str == null || str.isEmpty();
}
}


Как это работает под капотом:
Lombok делает класс финальным, генерирует приватный конструктор и делает все методы и поля статическими.

Сгенерированный код:
public final class StringUtils {
private StringUtils() {
throw new UnsupportedOperationException("Utility class");
}

public static boolean isEmpty(String str) {
return str == null || str.isEmpty();
}
}


Нюансы использования:
Класс становится финальным, и его нельзя наследовать.
Конструктор приватный, что предотвращает создание экземпляров класса.


Аннотация @FieldDefaults

Аннотация @FieldDefaults управляет модификаторами доступа полей, например, автоматически добавляет final или private.

Пример использования:
import lombok.experimental.FieldDefaults;
import lombok.AccessLevel;

@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public class User {
String name;
int age;
}


Как это работает под капотом:
Lombok добавляет указанные модификаторы доступа ко всем полям класса.

Сгенерированный код:
public class User {
private final String name;
private final int age;
}


Нюансы использования:
Можно указать уровень доступа (PRIVATE, PUBLIC, PROTECTED) и добавить final к полям.
Если поле уже имеет модификатор доступа, он не будет изменен.

#Java #Training #Spring #Lombok #Cleanup #Delegate #UtilityClass #FieldDefaults
January 17
Что выведет код?

public class Task170125_1 {
public static void main(String[] args) {
int i = 0;
while (i++ < 5) {
if (i == 3) continue;
System.out.print(i + " ");
}
}
}


#Tasks
January 17
Варианты ответа:
Anonymous Quiz
13%
1 2 3 4 5
60%
1 2 4
0%
2 3 4 5
20%
1 2 4 5
7%
5 4 2 1
January 17
Или еще маленько подождать? 🤔 😃

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
January 17
Продвинутые аннотации Lombok и лучшие практики

Аннотация @ExtensionMethod

Аннотация @ExtensionMethod позволяет добавлять методы-расширения к существующим классам. Это похоже на extension-методы в Kotlin или C#.

Пример использования:
import lombok.experimental.ExtensionMethod;
import java.util.Collections;

@ExtensionMethod(Collections.class)
public class ListUtils {
public void example() {
java.util.List<String> list = new java.util.ArrayList<>();
list.add("Hello");
list = unmodifiableList(list); // Метод из Collections
}
}


Как это работает под капотом:
Lombok преобразует вызовы методов-расширений в вызовы статических методов.

Сгенерированный код:
public class ListUtils {
public void example() {
java.util.List<String> list = new java.util.ArrayList<>();
list.add("Hello");
list = Collections.unmodifiableList(list);
}
}


Нюансы использования:
Методы-расширения должны быть статическими.
Аннотация находится в экспериментальном статусе и может измениться в будущем.


Аннотация @Accessors

Аннотация @Accessors настраивает поведение геттеров и сеттеров, например, позволяет создавать цепочные сеттеры.

Пример использования:
import lombok.experimental.Accessors;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Accessors(chain = true)
public class User {
private String name;
private int age;
}

// Использование:
User user = new User().setName("John").setAge(30);


Как это работает под капотом:
Lombok генерирует сеттеры, которые возвращают this, что позволяет использовать цепочки вызовов.

Сгенерированный код:
public class User {
private String name;
private int age;

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

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


Нюансы использования:
Можно настроить префиксы для геттеров и сеттеров:
@Accessors(prefix = "m_")
private String m_name;


Аннотация @Wither

Аннотация @Wither создает методы для создания копии объекта с измененным значением одного поля. Это аналог @With, но находится в экспериментальном статусе.

Пример использования:
import lombok.experimental.Wither;

@Wither
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);
}
}


Нюансы использования:
Работает только с final-полями.
Находится в экспериментальном статусе.


Аннотация @Helper

Аннотация @Helper создает локальные вспомогательные классы внутри методов.

Пример использования:
import lombok.experimental.Helper;

public class Example {
public void exampleMethod() {
@Helper
class LocalHelper {
void help() {
System.out.println("Helping!");
}
}
new LocalHelper().help();
}
}


Как это работает под капотом:
Lombok создает локальный класс, который можно использовать внутри метода.

Сгенерированный код:
public class Example {
public void exampleMethod() {
class LocalHelper {
void help() {
System.out.println("Helping!");
}
}
new LocalHelper().help();
}
}


Нюансы использования:
Находится в экспериментальном статусе.
Полезно для организации кода внутри методов.


#Java #Training #Spring #Lombok #ExtensionMethod #Accessors #Wither #Helper
January 17
Лучшие практики использования Lombok

Когда использовать Lombok:

Для сокращения шаблонного кода (геттеры, сеттеры, конструкторы).
Для улучшения читаемости кода.


Как избежать злоупотребления:
Не используйте Lombok для сложной логики.
Избегайте чрезмерного использования аннотаций, таких как
@Data или @AllArgsConstructor.

Совместимость с другими библиотеками:

Lombok может конфликтовать с Jackson, Hibernate и другими библиотеками. Будьте осторожны с аннотациями, которые генерируют методы.

Проблемы и ограничения Lombok

Проблемы с поддержкой в IDE:
Некоторые IDE могут некорректно обрабатывать код с Lombok. Убедитесь, что плагин Lombok установлен и настроен.

Ограничения при использовании с другими инструментами:
Например, Jackson может не работать с @Data, если не настроены правильные геттеры и сеттеры.

Отладка:
Поскольку сгенерированный код не отображается в исходниках, отладка может быть сложнее. Убедитесь, что ваша IDE поддерживает Lombok.

#Java #Training #Spring #Lombok #Best_practices
January 17
Всем доброго субботнего утра! ☀️

Как планируете провести выходные?

А я на завтра ничего не подготовил... Может кто хочет что-нибудь показать? 🧐

Кроме этого, у нас знаменательное событие - канал устойчиво достиг количества в 5⃣0⃣0️⃣ подписчиков 🥳

Много это или мало? Лично для меня - огромно!
Вспоминая как начинался этот канал с 15 подписчиками из интенсива JavaRush, сейчас цифра 500 человек воспринимается как значительное достижение.
Хотелось бы сказать "Спасибо
🙂" каждому, кто осознанно приписывает себя в постоянный состав подписчиков, тех кто не стесняясь приходит на воскресные встречи и принимает непосредственное участие в жизни канала.

Я рад что вы со мной.
🤝

А канал однозначно будет развиваться дальше. После изучения Java Core и Spring, пройдемся по фраймворкам с которыми взаимодействуешь каждый день, потом более редким, но эффективным и так далее... Будем однозначно встречаться по воскресениям и писать что-то злободневное для новичков 😁

Уверен что совместно, мы сделаем наш канал отличным подспорьем для развития Javистов-новичков, а так же платформой где можно пообщаться и узнать что-то новое!
👍

И не стесняйтесь что-то предлагать для развития канала!

Я не SMM-щик и в силу того, что все это делаю один, мне элементарно порой не хватает времени на свежие идеи
😎
Please open Telegram to view this post
VIEW IN TELEGRAM
January 18
Please open Telegram to view this post
VIEW IN TELEGRAM
January 18
Please open Telegram to view this post
VIEW IN TELEGRAM
January 19
This media is not supported in your browser
VIEW IN TELEGRAM
Всем привет! 🖐

Сегодня, как всегда в 16:00 по МСК, я организую встречу в Яндекс.Телемост.

Сегодня темы встречи нет, пообсуждаем как космические корабли бороздят просторы вселенной... 🤣

Приходите, будет неинтересно
😏

😁😁😁
Please open Telegram to view this post
VIEW IN TELEGRAM
January 19
https://telemost.yandex.ru/j/09250961426847

Встреча создана, кому скучно - заходите
😂
Please open Telegram to view this post
VIEW IN TELEGRAM
January 19
Цитата дня: Ричард Фейнман

"То, что я не могу создать, я не могу понять."


Эта фраза принадлежит легендарному физику и нобелевскому лауреату Ричарду Фейнману. Ее суть — в идее, что настоящее понимание приходит только через действие. Если ты не можешь что-то воссоздать, объяснить или построить с нуля, значит, твое знание поверхностно.

Фейнман использовал этот принцип в обучении и науке, показывая, что глубина понимания важнее заучивания фактов. Отличный повод задуматься: насколько хорошо мы действительно разбираемся в том, что считаем знакомым?


Почитать био:
https://habr.com/ru/articles/405517/
https://habr.com/ru/companies/getmeit/articles/646085/
https://habr.com/ru/companies/onlinepatent/articles/818699/

#Citation #Biography
January 20
Всем привет!

Начинаем серию постов для углубления недостаточно рассмотренных и актуальных тем.


Классы для работы с датами и временем в Java Time API

Java Time API (пакет java.time) был введен в Java 8 для замены устаревших классов Date и Calendar. Он предоставляет удобные и неизменяемые (immutable) классы для работы с датами и временем.

1. LocalDate

Класс LocalDate представляет дату без времени и временной зоны. Он используется для работы с датами, такими как дни рождения, сроки выполнения задач и т.д.

Пример использования:
LocalDate today = LocalDate.now(); // Текущая дата
LocalDate specificDate = LocalDate.of(2023, 10, 15); // Конкретная дата

System.out.println("Сегодня: " + today);
System.out.println("Конкретная дата: " + specificDate);


Плюсы:
Простота использования.
Неизменяемость (immutable), что делает его потокобезопасным.

Минусы:
Не поддерживает время и временные зоны.

2. LocalTime

Класс LocalTime представляет время без даты и временной зоны. Он используется для работы с временем, например, для учета времени начала и окончания событий.

Пример использования:

LocalTime now = LocalTime.now(); // Текущее время
LocalTime specificTime = LocalTime.of(14, 30); // Конкретное время

System.out.println("Сейчас: " + now);
System.out.println("Конкретное время: " + specificTime);


Плюсы:
Удобен для работы только с временем.
Неизменяемость.


Минусы:
Не поддерживает даты и временные зоны.

3. LocalDateTime

Класс LocalDateTime объединяет LocalDate и LocalTime, представляя дату и время без временной зоны. Он используется, когда нужно работать с датой и временем одновременно.

Пример использования:
LocalDateTime now = LocalDateTime.now(); // Текущая дата и время
LocalDateTime specificDateTime = LocalDateTime.of(2023, 10, 15, 14, 30); // Конкретная дата и время

System.out.println("Сейчас: " + now);
System.out.println("Конкретная дата и время: " + specificDateTime);


Плюсы:
Удобен для работы с датой и временем.
Неизменяемость.

Минусы:
Не поддерживает временные зоны.

4. ZonedDateTime

Класс ZonedDateTime расширяет LocalDateTime, добавляя информацию о временной зоне. Он используется для работы с датой и временем в конкретной временной зоне.

Пример использования:
ZonedDateTime nowInTokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo")); // Текущее время в Токио
ZonedDateTime specificDateTimeInNewYork = ZonedDateTime.of(2023, 10, 15, 14, 30, 0, 0, ZoneId.of("America/New_York"));

System.out.println("Сейчас в Токио: " + nowInTokyo);
System.out.println("Конкретное время в Нью-Йорке: " + specificDateTimeInNewYork);


Плюсы:
Поддержка временных зон.
Неизменяемость.


Минусы:
Сложнее в использовании из-за необходимости учитывать временные зоны.

5. Форматирование и парсинг: DateTimeFormatter

Класс DateTimeFormatter используется для форматирования и парсинга дат и времени. Он поддерживает множество предопределенных форматов, а также позволяет создавать собственные.

Пример использования:
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");

String formattedDateTime = now.format(formatter); // Форматирование
System.out.println("Форматированная дата и время: " + formattedDateTime);

LocalDateTime parsedDateTime = LocalDateTime.parse("15.10.2023 14:30:00", formatter); // Парсинг
System.out.println("Распарсенная дата и время: " + parsedDateTime);


Плюсы:
Гибкость в настройке форматов.
Поддержка локализации.


Минусы:
Требует внимательности при указании форматов, чтобы избежать ошибок.

#Java #Training #Medium #Date #LocalDate #LocalTime #LocalDateTime #ZonedDateTime #DateTimeFormatter
January 20
Что выведет код?

import java.time.LocalDate;
import java.time.Period;

public class Task200125_1 {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2024, 10, 1);
LocalDate date2 = LocalDate.of(2024, 9, 30);
Period period = Period.between(date1, date2);
System.out.println(period.getDays());
}
}


#Tasks
January 20
Варианты ответа:
Anonymous Quiz
34%
1
7%
0
28%
-1
31%
RuntimeException
January 20
И покрытие тестами... 🤔 😃

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
January 20