New We are sorting MAX channels into categories and territories. Read the news
Public channel ID 68536775128494

Java библиотека

Книги, статьи, мемы и многое другое для Java программиста!

По сотрудничеству и рекламе: https://t.me/NadikaKir или в ЛС сообщества ВК https://vk.com/javatutorial

Канал в перечне РКН: https://vk.cc/cJrT4A

Мы на бирже: https://telega.in/c/javalib/

Сообщество VK https://vk.com/javatutorial

Channels in category
2 112
This channel's rank
№ 69
Open category →
Channels in category
20 175
This channel's rank
№ 264
Open category →
Russia
Open in MAX

Posts for the period

By reactions

Search and the whole feed — after free registration. Custom dates — with a subscription; the channel owner sees them for free. Sorting by reactions — with a subscription. Sign up

Loading…

Проверяем пересечение бронирований на Java!

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

Сделаем модель с полуоткрытым интервалом, где начало включается, а конец уже свободен:
record Booking(LocalDateTime start, LocalDateTime end) {
    Booking {
        if (!start.isBefore(end)) {
            throw new IllegalArgumentException("End must be after start");
        }
    }

boolean overlaps(Booking other) {
        return start.isBefore(other.end())
            && other.start().isBefore(end);
    }
}

Проверка не даст создать бронь нулевой или отрицательной длины. Условие пересечения учитывает обе границы и не считает соседние интервалы конфликтом.

Подготовим уже занятые промежутки и новый запрос:
List<Booking> existing = List.of(
    new Booking(start1, end1),
    new Booking(start2, end2)
);
Booking requested = new Booking(requestStart, requestEnd);

Здесь предполагается, что все значения уже приведены к одной временной зоне. Для расписания в нескольких регионах лучше сравнивать Instant, а исходный ZoneId сохранять отдельно.

Проверим весь список и получим понятный результат:
boolean conflict = existing.stream()
    .anyMatch(booking -> booking.overlaps(requested));

anyMatch завершает проверку, как только найдёт первое пересечение. Если conflict равен false, новую бронь можно добавить, а интервалы, которые соприкасаются ровно по границе, останутся допустимыми.

Java Библиотека | Мы в Телеграм
Views: 91
Go to post Open in MAX Report an inaccuracy
☕️ Скользящие окна в Stream без ручного буфера

Нужно сравнить соседние измерения или обработать последовательность небольшими перекрывающимися группами? В Java 24+ есть готовый gatherer.

var windows = Stream.of(1, 2, 3, 4, 5)
    .gather(Gatherers.windowSliding(3))
    .toList();

// [[1, 2, 3], [2, 3, 4], [3, 4, 5]]

Каждое следующее окно теряет самый старый элемент и получает новый. Если вход короче размера окна, получится одно неполное окно; пустой Stream не выдаст ни одного.

🟡 Окна нельзя изменять. Большой размер окна может потреблять лишнюю память — это не бесплатная замена любого буфера.

Gatherers стали стабильным API в Java 24. В докладе автора API есть примеры собственных преобразований и правила работы с параллельными потоками.

🔗 Источник • Разбор и примеры

══════ Навигация ══════
Вакансии • Задачи • Собесы

Java Библиотека | Мы в Телеграм
Views: 144
Go to post Open in MAX Report an inaccuracy
Шпаргалка по выбору типа даты и времени в Java!

Для календарного интервала вроде срока подписки используют Period, а для точной длительности в часах и секундах подходит Duration. Когда важен конкретный момент, выбирают Instant или тип с часовым поясом.

На картинке собрана схема выбора между LocalDate, LocalTime, LocalDateTime, Instant и ZonedDateTime. Она помогает не потерять часовой пояс там, где он влияет на расписание и переходы летнего времени.

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

Java Библиотека | Мы в Телеграм
Views: 201
Go to post Open in MAX Report an inaccuracy
final, finally и finalize: разные задачи

final запрещает повторное присваивание переменной, переопределение метода или наследование класса. final-ссылка не делает объект неизменяемым:
final var names = new ArrayList<String>();
names.add("Java"); // допустимо

finally выполняется при выходе из try, в том числе после return или исключения. Это не гарантия на случай аварийного завершения JVM. Для AutoCloseable обычно удобнее try-with-resources.

finalize() — устаревший механизм финализации. В Java 18 его пометили для удаления, а не удалили: метод ещё присутствует в API Java 25. Момент вызова не гарантирован, поэтому закрывать файлы и соединения через него нельзя.

#Java

Java Библиотека | Мы в Телеграм
Views: 227
Go to post Open in MAX Report an inaccuracy
Подборка Spring от 13 октября: что открыть

В выпуске This Week in Spring от 13 октября собраны материалы по Spring Boot, Spring Modulith, Spring AI и инструментам разработчика.

Такую подборку удобнее читать выборочно: выберите технологию из своего проекта, откройте первоисточник и сопоставьте версию API со своей. Одна ссылка из обзора не заменяет проверку совместимости зависимостей.

Полный выпуск с исходными ссылками.

#Java

Java Библиотека | Мы в Телеграм
Views: 229
Go to post Open in MAX Report an inaccuracy
Spring: контейнер собирает зависимости

В обычном Java-коде объект можно создать через new и передать зависимости в конструктор. В Spring ту же сборку берёт на себя IoC-контейнер: создаёт бины по конфигурации и связывает их.

Dependency Injection означает, что объект получает зависимости извне. Он не должен сам искать их через глобальный доступ к контейнеру.

Constructor injection удобно использовать для обязательных зависимостей: состав объекта виден из сигнатуры конструктора, а поля могут быть final.

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

#Java

Java Библиотека | Мы в Телеграм
Views: 237
Go to post Open in MAX Report an inaccuracy
Webhook: подписывайте исходные байты запроса

Для HMAC-SHA256 сервер вычисляет MAC по исходному телу и общему секрету, затем сравнивает результат с присланной подписью.

В Java используются Mac.getInstance("HmacSHA256") и SecretKeySpec. Для сравнения байтовых массивов подходит MessageDigest.isEqual(expected, provided).

Важны детали протокола: секрет может быть строкой или Base64-данными, а подпись — hex либо Base64. Декодируйте именно тот формат, который задаёт отправитель.

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

HMAC не предотвращает повторную доставку. Для этого отдельно нужны правила проверки времени или учёт идентификаторов событий.

#Java

Java Библиотека | Мы в Телеграм
Views: 232
Go to post Open in MAX Report an inaccuracy
unmodifiableList: представление, а не снимок

var source = new ArrayList<>(List.of("A"));
var view = Collections.unmodifiableList(source);
var snapshot = List.copyOf(source);
source.add("B");
System.out.println(view);     // [A, B]
System.out.println(snapshot); // [A]

Обёртка запрещает изменение списка через view, но показывает изменения исходного списка.

List.copyOf(), доступный с Java 10, создаёт независимый по составу неизменяемый список и не принимает null-элементы. Копия поверхностная: изменяемые объекты внутри неё остаются теми же объектами.

При возврате данных из сервиса решите, нужен читателю текущий вид коллекции или снимок на момент вызова.

#Java

Java Библиотека | Мы в Телеграм
Views: 239
Go to post Open in MAX Report an inaccuracy
Загрузчик классов — часть идентичности типа

Для JVM класс определяется не только именем, но и загрузчиком, который его определил. Два одноимённых класса из разных загрузчиков могут оказаться несовместимыми типами.

В типичной современной JVM есть bootstrap, platform и application class loader. Пользовательский загрузчик может добавлять свой способ поиска классов.

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

Конкретная схема может отличаться от стандартной, например в контейнерах и системах плагинов.

#Java

Java Библиотека | Мы в Телеграм
Views: 242
Go to post Open in MAX Report an inaccuracy
Безопасность Java: десять проверок перед релизом

1. Проверяйте входные данные и отдельно права на действие. Валидация не заменяет авторизацию.
2. Передавайте SQL-значения параметрами PreparedStatement. Имена таблиц и колонок выбирайте из разрешённого набора.
3. Не отдавайте клиенту stack trace и внутреннюю конфигурацию.
4. Храните секреты вне репозитория, определите способ их ротации.
5. Проверяйте доступ к конкретному объекту, а не только роль пользователя.
6. Ограничивайте десериализуемые типы. JSON сам по себе не гарантирует безопасность.
7. Следите за уязвимостями и обновлениями зависимостей.
8. Не записывайте пароли и токены в логи.
9. Настройте Secure, HttpOnly и подходящий SameSite для сессионных cookie.
10. Проверьте защитные заголовки и CSP под конкретный интерфейс.

Настройки нужно проверять вместе с поведением приложения, а не только наличием аннотаций.

#Java

Java Библиотека | Мы в Телеграм
Views: 256
Go to post Open in MAX Report an inaccuracy
The full feed — after free sign-up
VKontakte Telegram Odnoklassniki
Favorites at datool.ru

Follow the channel in your account

Sign up at datool.ru to add the channel “Java библиотека” to favorites and track its metrics.

Sign up
For channel owners

Verify your channel

Sign in or sign up at datool.ru, then add our bot to the channel following the instructions in your account. Once ownership is verified, the lock disappears and channel management becomes available.

Sign in or sign up

Report an inaccuracy

Describe what needs fixing. If you have a source, add a link.

You are leaving datool.ru

The link leads to an external website. datool.ru is not responsible for its content — check the address before entering passwords or payment details.

Redirecting in 10 s

Go