Java Ready | Программирование
9.1K subscribers
1.42K photos
77 videos
1 file
747 links
Авторский канал по разработке на Java.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Cотрудничество: @energy_c
Download Telegram
Как в Java чище проверять тип через pattern matching?

Раньше при проверке типа часто писали так:
if (value instanceof String) {
String text = (String) value;
System.out.println(text.length());
}


Код рабочий, но в нём есть лишнее приведение типа. Сначала Java уже проверила, что value это String, а потом мы всё равно руками делаем cast.

В современном Java можно записать короче:
if (value instanceof String text) {
System.out.println(text.length());
}


Переменная text доступна только там, где проверка точно прошла.

Это удобно для валидации:
if (input instanceof String text && !text.isBlank()) {
return text.trim();
}


И для обработки разных входных объектов:
if (event instanceof LoginEvent login) {
audit(login.userId());
}


При этом Java не даст использовать переменную вне безопасной области:
if (!(value instanceof String text)) {
return;
}

System.out.println(text.length());


Здесь text уже доступен после return, потому что дальше код дойдёт только если value действительно String.

Такой синтаксис особенно приятен в коде с Object, событиями, DTO, sealed-иерархиями и обработкой внешних данных.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍6❤5
Media is too big
VIEW IN TELEGRAM
Tutorialspoint Java Tutorial - большой справочник по Java!

На сайте собраны разделы по синтаксису, типам данных, операторам, циклам, массивам, ООП, исключениям, коллекциям, потокам, файлам и другим темам, которые часто нужны при изучении и повторении языка.

Оставляю ссылочку на Tutorialspoint

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍5🔥5
Хорошая статья про JWT-авторизацию на Spring Security!

Автор показывает, как собрать авторизацию через access tokens и связать Spring Security с регистрацией, логином, ролями и проверкой токена в защищённых запросах.

В статье автор показывает:
• как настроить регистрацию и вход пользователя
• как выпускать и проверять JWT-токен
• как подключить фильтр авторизации к SecurityFilterChain

Продолжай читать на Habr


👉 Java Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍5🔥4
Собираем простой шаблонизатор строк на Java!

Нужно заменить плейсхолдеры вида {name} и {orderId} значениями из Map. Если значение отсутствует, оставим плейсхолдер как есть, чтобы ошибка была заметна в итоговом тексте.

В этой задаче:
• находим плейсхолдеры через Pattern
• достаём имя переменной из группы
• безопасно подставляем значение


Такой шаблонизатор полезен для писем, логов, уведомлений, CLI-сообщений и генерации простых текстов без подключения тяжёлого template engine.

👉 Java Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3🔥3
Разбираем CompletableFuture: 7 приёмов для асинхронного Java-кода!

CompletableFuture помогает строить цепочки асинхронных операций без ручного управления Thread. С ним удобно запускать фоновые задачи, преобразовывать результаты, объединять независимые запросы, обрабатывать ошибки и ограничивать время ожидания.

👉 Java Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤3👍3🤝2
Полезный разбор Java-приложений в Kubernetes!

Автор собирает практики, которые помогают запускать JVM-сервисы в контейнерах предсказуемо и без лишних проблем с ресурсами, healthcheck и завершением процесса.

В статье автор показывает:
• как учитывать память контейнера при настройке JVM
• зачем нужны readiness и liveness probes
• почему graceful shutdown важен для сервисов под нагрузкой

Продолжай читать на Habr


👉 Java Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3🔥2
Почему изменяемый ключ в HashMap может сломать поиск?

HashMap ищет значение не просто по содержимому объекта. Сначала он использует hashCode ключа, чтобы выбрать внутреннюю корзину, а потом уже сравнивает ключи через equals.

Представим ключ, где hashCode зависит от поля name:
class UserKey {
String name;

UserKey(String name) {
this.name = name;
}
}


Если такой объект положить в map, всё выглядит нормально:
var key = new UserKey("alice");
map.put(key, "admin");


Проблема начинается, если после вставки изменить поле, участвующее в equals или hashCode.

Например так:
key.name = "bob";

System.out.println(map.get(key));


Теперь объект физически лежит в той корзине, которая была рассчитана для alice. Но при поиске HashMap уже считает хеш для bob и идёт искать в другое место.

Из-за этого даже containsKey может вернуть false:
System.out.println(map.containsKey(key));


Это выглядит очень странно, потому что ссылка на объект осталась той же. Но для HashMap важна стабильность equals и hashCode на всё время, пока объект используется как ключ.

Надёжнее делать ключ неизменяемым:
record UserKey(String name) {}


Если нужен обычный класс, поля ключа лучше сделать final и не давать сеттеры. Тогда объект не сможет поменять свой hashCode после добавления в map.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤3👍3
Шпаргалка по состояниям потока в Java!

Например, NEW означает созданный, но ещё не запущенный поток, RUNNABLE готов к выполнению, WAITING ждёт другого события, а TERMINATED означает завершение работы.

На картинке показан lifecycle потока. Есть переходы между NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING и TERMINATED, а также методы, которые могут переводить поток из одного состояния в другое.

Сохрани, чтобы не потерять!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤7👍4
Делаем простую очередь задач через BlockingQueue!

Когда один поток создаёт задачи, а другой их обрабатывает, не хочется вручную писать wait, notify и синхронизацию вокруг списка.

Для такого сценария в Java есть BlockingQueue. Она сама умеет ждать элементы и блокировать запись, если очередь ограничена по размеру.

Сначала создадим очередь с лимитом:
BlockingQueue<String> queue = new ArrayBlockingQueue<>(100);


Producer может добавлять задачи через put:
queue.put("send-email");
queue.put("build-report");


Если очередь заполнена, put подождёт свободное место. Это полезно, когда обработчик не успевает за входящим потоком задач.

Consumer забирает элементы через take:
String task = queue.take();
System.out.println(task);


Если очередь пустая, take будет ждать новый элемент. Поэтому не нужен бесконечный цикл с Thread.sleep и ручной проверкой size.

Часто worker запускают в отдельном потоке:
while (!Thread.currentThread().isInterrupted()) {
String task = queue.take();
handle(task);
}


Для остановки можно использовать interrupt или специальную poison pill задачу. Главное, что обмен между потоками остаётся явным и контролируемым.

BlockingQueue хорошо подходит для фоновой обработки писем, логов, webhook-событий, небольших worker-пулов и простых producer-consumer задач.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤4🔥3
Шпаргалка по JUnit 5!

Например, @Test помечает тестовый метод, @BeforeEach запускает подготовку перед каждым тестом, а assertAll позволяет проверить несколько условий и увидеть все ошибки сразу.

Сохрани, чтобы не потерять!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤4🔥2
Зачем в Java использовать try-with-resources?

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

Раньше это часто делали через finally:
BufferedReader reader = new BufferedReader(
new FileReader("app.log")
);

try {
System.out.println(reader.readLine());
} finally {
reader.close();
}


Если ресурсов несколько, finally быстро разрастается.

В Java для этого есть try-with-resources:
try (BufferedReader reader = Files.newBufferedReader(path)) {
System.out.println(reader.readLine());
}


После выхода из блока Java сама вызовет close().

Это работает для любых объектов, которые реализуют AutoCloseable:
try (Connection connection = dataSource.getConnection()) {
// работа с базой
}


Можно открыть несколько ресурсов:
try (
var input = Files.newInputStream(source);
var output = Files.newOutputStream(target)
) {
input.transferTo(output);
}


Оба ресурса будут закрыты автоматически, даже если внутри блока возникнет исключение.

Это особенно важно в серверном коде:
try (var stream = storage.open(fileId)) {
return stream.readAllBytes();
}


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

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🔥3
Media is too big
VIEW IN TELEGRAM
W3Resource Java Exercises - большая база задач по Java!

На сайте собраны тысячи упражнений по Java с решениями и пояснениями. Есть базовый синтаксис, методы, массивы, строки, коллекции, исключения, потоки, ООП, регулярные выражения и алгоритмы.

Разделы удобно проходить как практику. Можно открыть конкретную тему, решить задачу самостоятельно, сравнить с готовым решением и перейти к похожим упражнениям.

Оставляю ссылочку на W3Resource

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤8🔥5