Java библиотека


Kanal geosi va tili: Rossiya, Ruscha


Книги, статьи, мемы и многое другое для Java программиста!
По сотрудничеству и рекламе: @NadikaKir
Канал в перечне РКН: https://vk.cc/cJrT4A
Мы на бирже: https://telega.in/c/javalib/
Сообщество VK https://vk.com/javatutorial

Зарегистрирован в РКН
Bog‘liq kanallar  |  O‘xshash kanallar

Kanal geosi va tili
Rossiya, Ruscha
Statistika
Postlar filtri


Как войти в Data Science в 2026 году?

Бесплатный эфир для тех, кто хочет разобраться, какие навыки нужны для первой работы в Data Science.

Опытный практикующий специалист проведёт практическое занятие и понятным языком разберёт:
✅путь от первой строки в Python до проекта для портфолио
✅как собрать pet-проект
✅что изучать для перехода в Data Science
✅реальные практические задачи

Посмотрите реальные истории студентов, которые сменили профессию.

Регистрируйтесь бесплатно и получите 3 курса в подарок для старта в для старта в Data science!

Записаться

#реклама 16+
simulative.ru

О рекламодателе


Spring AI показал, как сделать RAG заметно умнее обычного vector search.

Проблема классического RAG: похожий документ ещё не значит полезный.

Новый пайплайн делает так:

Question → Rewrite → MultiQuery → Vector Search → Jev Filter → Rerank → LLM

Jev проверяет каждый найденный chunk: есть ли там реальный ответ, противоречие или prompt injection.

В демо vector search нашёл 6 фрагментов, но до модели дошли только 2 действительно полезных.

Меньше мусора в контексте → точнее ответы и меньше шансов на prompt injection.

Код и разбор:
https://spring.io/blog/2026/10/02/spring-ai-modular-rag-typesafe-jev/

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


Тестируйте крайние случаи: null, пустые значения и границы часто скрывают баги

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

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


МАСШТАБная конференция о дизайне и карьере от НИУ ВШЭ

В прямом эфире соберутся 40+ спикеров, работающих с Яндексом, Apple, Cartier, а также такими топовыми звёздами, как The Weeknd, Drake и Zivert. Именно они расскажут о своем профессиональном опыте, обсудят актуальные дизайн-тренды и возможности построения карьеры в России и за рубежом.

1 день, 3 трека и 7 часов экспертных докладов, которые вы не услышите бесплатно нигде, кроме МАСШТАБА.

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

14 октября, 12:00–18:35
онлайн
бесплатно, по регистрации

Узнать больше

#реклама 16+
masshtab.hse.ru

О рекламодателе


Spring Boot 4: переименовано свойство преобразования исключений

Было: spring.dao.exceptiontranslation.enabled
Стало: spring.persistence.exceptiontranslation.enabled
Используйте spring-boot-properties-migrator, чтобы обнаружить устаревшее свойство при миграции.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


Следим за появлением файлов в папке через WatchService!

Создадим наблюдатель и зарегистрируем каталог. Папка должна существовать заранее:
Path dir = Path.of("incoming");
try (WatchService watcher = FileSystems.getDefault().newWatchService()) {
dir.register(watcher, ENTRY_CREATE, ENTRY_MODIFY);

Константы ENTRY_CREATE и ENTRY_MODIFY берутся из StandardWatchEventKinds. try-with-resources закроет наблюдатель при выходе из блока.

Дальше ждём сигнал. Метод take блокирует поток, пока событие не появится:
while (true) {
WatchKey key = watcher.take();
for (WatchEvent event : key.pollEvents()) {

Контекст события содержит имя относительно наблюдаемой папки, а не готовый абсолютный путь. Не подставляй его отдельно от dir:
if (event.kind() == OVERFLOW) continue;
Path file = dir.resolve((Path) event.context());
System.out.println(event.kind() + " " + file);
}

После обработки обязательно сбросим ключ. Если каталог удалён или больше недоступен, reset вернёт false:
if (!key.reset()) break;
}
}

События могут повторяться, а при перегрузке наблюдатель сообщит OVERFLOW. Поэтому важную обработку лучше делать идемпотентной и предусмотреть повторное сканирование каталога после переполнения.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


👨‍💻 Фронтенд с AI: что можно делегировать агентам

5 октября, стартует конференция Podlodka Frontend Crew — сезон о том, как применять AI во фронтенд-разработке на практике.

Участники конференции узнают:


• Как находить prompt injection и противостоять таким атакам;
• Какие подходы помогают повысить доверие к результатам агентской разработки;
• Как проводить ревью кода, созданного AI-агентами;
• Как AI помогает упростить починку багов.

В программе ещё много практических кейсов. Также нужно отметить, что у конференции очень удобный формат. Это пять дней Zoom-сессий по утрам и вечерам и закрытое Telegram-комьюнити, где можно обсудить новый опыт и узнать от единомышленников то, что не догадаешься спросить у своей LLM.

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

Скидка по промокоду Javalib

🔗 Программа и билеты: https://podlodka.io/fecrew


Почему один и тот же Java-файл .class запускается на Windows, Linux и macOS без перекомпиляции?

Секрет не в самом языке Java, а в JVM. Вот какой путь проходит программа:
Hello.java → javac → Hello.class (байткод) → JVM → машинный код → выполнение программы

Именно этот дополнительный уровень абстракции даёт Java её знаменитую возможность: «Написал один раз — запускай где угодно». Когда понимаешь эту цепочку, разобраться в JIT-компиляции, сборке мусора и настройке JVM становится гораздо проще.

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


Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


Ленивая инициализация через Supplier — элегантная альтернатива double-checked locking

Когда нужно отложить создание тяжёлого объекта до первого обращения, многие вспоминают double-checked locking:

private volatile SomeHeavyObject obj;

public SomeHeavyObject getObj() {
if (obj == null) {
synchronized (this) {
if (obj == null) {
obj = new SomeHeavyObject();
}
}
}
return obj;
}


Многословно, хрупко, легко ошибиться. Есть лучше.

Современный подход — использовать Supplier с ленивой инициализацией:

private final Supplier lazyObj = Suppliers.memoize(SomeHeavyObject::new);

public SomeHeavyObject getObj() {
return lazyObj.get();
}


Suppliers.memoize — из Guava. Он гарантирует потокобезопасную инициализацию один раз при первом вызове get().

Плюсы:
— Читается за секунду
— Потокобезопасно
— Нет дублирования кода
— Легко тестировать и заменять

Альтернатива в чистой Java: использовать AtomicReference и updateAndGet, но это уже длиннее и менее выразительно.

Если используешь Spring — можно просто обернуть бин в @Lazy. Но вне Spring, в обычных Java-приложениях или утилитах — Supplier с memoize() идеален.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


🤖 Как спроектировать ИИ-агента для корпоративной среды?

6 октября в Архитектурном клубе Яндекс 360 разберут, как собрать такую систему: оркестратор, инструменты, память, поиск и наблюдаемость.

Даниил Смирнов, руководитель разработки ИИ-платформы Яндекс 360, расскажет об интеграции с корпоративными источниками, контрактах инструментов и наследовании прав доступа. А еще о том, как ограничивать автономность агента и оценивать качество поиска, выбора инструментов и итогового ответа.

🗓 6 октября, 17:00 МСК
💻 Онлайн, бесплатно

→ Зарегистрироваться на эфир


Почему trim() может не убрать пробелы по краям строки?

В Java часто очищают пользовательский ввод так:
String name = input.trim();

Но trim() ориентируется на символы с кодом не выше U+0020. Некоторые пробельные символы Unicode под это правило не попадают.

Например, строка может начинаться и заканчиваться широким пробелом U+2003:
String input = "\u2003admin\u2003";
System.out.println(input.trim().length());

Видимые на экране отступы останутся. Это может сломать сравнение логина, поиск ключа или проверку поля формы.

Начиная с Java 11 есть strip(), который опирается на определение пробельного символа в Character.isWhitespace:
String name = input.strip();
System.out.println(name.equals("admin"));

Если нужна очистка только с одной стороны, есть отдельные методы:
String left = input.stripLeading();
String right = input.stripTrailing();

Для проверки строки, состоящей только из пробелов, пригодится isBlank():
if (input.isBlank()) {
throw new IllegalArgumentException("Empty name");
}

strip() не удаляет все символы, которые выглядят как пробелы. Для специальных форматов ввода полезно отдельно определить допустимые символы.


Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


Java: не создавайте тяжёлые объекты раньше времени

Если объект дорогой в создании, но нужен только в редких сценариях, eager initialization может зря тратить время и память.

Вместо этого используйте lazy initialization:

private HeavyAnalyzer analyzer;

private HeavyAnalyzer analyzer() {
if (analyzer == null) {
analyzer = new HeavyAnalyzer();
}
return analyzer;
}

Так HeavyAnalyzer создастся только при первом реальном обращении.
Где особенно полезно:

- кэши;
- API-клиенты;
- тяжёлая конфигурация;
- анализаторы;
- объекты с дорогой инициализацией.
Для более чистого кода можно использовать Supplier, holder pattern или современные lazy-механизмы Java.

Если доступ идёт из нескольких потоков, простая проверка if (analyzer == null) уже недостаточна - нужна потокобезопасная реализация.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


Java Guru 🤓 dan repost


Во многих приложениях есть такой эндпоинт.

Фронтенд удаляет JWT после того, как пользователь нажимает «Выйти». Но вот вопрос… Действительно ли пользователь вышел из системы?

Что, если:
• JWT скопировали до выхода?
• Срок действия токена ещё не истёк?
• Другое устройство всё ещё использует тот же токен?

Будет ли ваш бэкенд по-прежнему принимать этот JWT? Как вы реализуете выход из системы в архитектуре со stateless JWT?

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


Почему одни ИИ-агенты помогают разработчикам экономить время, а другие требуют постоянной доработки? При создании агентных систем важно не только подключить LLM, но и правильно организовать логику работы агентов. Без единых подходов разработка замедляется: одни и те же решения приходится создавать заново, а поведение системы становится сложнее контролировать.

На открытом уроке 1 октября в 20:00 МСК разберем, как Agent Skills помогают ускорить создание ИИ-агентов, стандартизировать их логику и повторно использовать готовые решения. Вы узнаете, какие ИИ-инструменты помогают разработчикам быстрее собирать агентные системы и как применять эти подходы на практике.

Урок пройдет в преддверие старта курса «Разработка ИИ-агентов». Занятие подойдет разработчикам, ИИ-инженерам и техническим специалистам, которые создают агентные решения и хотят повысить скорость и качество разработки.

➡️Научитесь создавать более предсказуемые ИИ-агенты и тратить меньше времени на рутинную реализацию: https://vk.cc/d2a7xB

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576


Что такое механизм try-with-resources?

Механизм try-with-resources в Java — это конструкция, которая упрощает работу с ресурсами, требующими закрытия (например, файлы, сокеты, соединения с БД и т.д.). Он автоматически закрывает ресурсы после завершения блока try, избавляя от необходимости писать finally вручную.

Поддерживается с Java 7
Ресурсы должны реализовывать интерфейс AutoCloseable

Пример:

try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line = reader.readLine();
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
// reader будет закрыт автоматически, даже если произойдёт исключение


Почему это важно:

* Уменьшает boilerplate-код
* Исключает утечки ресурсов
* Упрощает обработку исключений

Совет:

С Java 9 можно использовать уже объявленные переменные, если они final или effectively final:

BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
try (reader) {
System.out.println(reader.readLine());
}

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


Запускаем внешнюю команду через ProcessBuilder!

Иногда Java-приложению нужно вызвать системную утилиту, например git, ffmpeg или собственный скрипт деплоя. Склеивать такую команду в одну строку опасно, особенно если параметры приходят извне.

ProcessBuilder принимает аргументы отдельно. Так пробелы и специальные символы не превращаются в случайный shell-код.
var process = new ProcessBuilder(
"git", "status", "--short")
.redirectErrorStream(true)
.start();

redirectErrorStream(true) объединяет обычный вывод и ошибки. Это не даёт процессу зависнуть, когда буфер stderr заполняется, пока приложение читает только stdout.
try (var reader = process.inputReader()) {
var lines = reader.lines().toList();
lines.forEach(System.out::println);
}

После чтения обязательно дождитесь завершения и проверьте код возврата. Нулевой код обычно означает успех.
int exitCode = process.waitFor();
if (exitCode != 0) {
throw new IllegalStateException("Command failed");
}

Для долгих команд добавьте waitFor с таймаутом и уничтожайте процесс при превышении лимита. Так интеграция с внешним инструментом не сможет навсегда заблокировать поток приложения.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


🌞 Hibernate выполняет SQL не в том порядке, в котором ты его написал

Код читается сверху вниз, а Hibernate так не работает. При flush'е Hibernate складывает все действия в ActionQueue и выполняет их в строго фиксированном порядке по типу операции, а не по порядку вызова в коде:

1. orphan removal
2. INSERT
3. UPDATE
4. удаление коллекций
5. обновление коллекций
6. вставка коллекций
7. DELETE


Классический пример с unique-ограничением:

repo.delete(oldRow); // (1) в коде сначала удаляем
repo.save(newRow); // (2) потом вставляем с тем же unique-значением
// commit -> ConstraintViolationException

На flush Hibernate переставит это в INSERT → DELETE. Вставка отработает до удаления, ловит конфликт по уникальному ключу, и падает, хотя в твоём коде последовательность была валидной.

🟡 Варианты решения:

— явный flush() между операциями, чтобы зафиксировать порядок;
— deferred (отложенные) constraints на стороне БД;
— пересмотр модели, чтобы коллизии в принципе не возникало.

Главное не считать, что порядок методов = порядок SQL. Это не так (для Hibernate).

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


👩‍💻 Как сделать Java-сервис устойчивее к сбоям

Resilience4j добавляет готовые паттерны CircuitBreaker, Retry, RateLimiter и Bulkhead без необходимости писать их с нуля.

Есть интеграции со Spring Boot, Reactor и Micrometer, а новая major-версия работает с Java 21+.

⛓ Ссылка на GitHub

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪


Java: используйте Deque вместо Stack для работы по принципу LIFO («последним пришёл — первым вышел»).

Stack — устаревший класс, который наследуется от Vector и синхронизирует каждый вызов.

Deque предоставляет те же методы push, pop и peek.
Используйте ArrayDeque: он быстрее и рекомендуется начиная с Java 6.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

20 ta oxirgi post ko‘rsatilgan.