Библиотека джависта | Java, Spring, Maven, Hibernate
22.1K subscribers
2.47K photos
56 videos
51 files
3.64K links
Все самое полезное для Java-разработчика в одном канале.

Учиться у нас: clc.to/AATM8w

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
иерархия_классов_исключений_в_Java.jpeg
69.8 KB
Сохраняйте шпаргалку с иерархией исключений

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

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥2
💡 Java-совет: выбирай инструмент для работы со временем правильно

В Java не стоит использовать System.currentTimeMillis() для всех задач подряд. Для разных сценариев есть свои инструменты.

🟢 Instant — конкретный момент времени в UTC.


Instant now = Instant.now();


Подходит для timestamp’ов, логов и фиксации времени событий.

🟢 Duration — продолжительность между временными точками.


Duration timeout = Duration.ofSeconds(30);


Удобно для таймаутов, задержек и других временных интервалов.

🟢 System.nanoTime() — когда нужно измерить, сколько выполнялся код.


long start = System.nanoTime();
// твоя логика
long elapsed = System.nanoTime() - start;


📌 Почему именно так:

— Instant работает с абсолютным временем
— Duration явно описывает временной интервал
— nanoTime() подходит для измерения прошедшего времени и не зависит от перевода системных часов

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

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍52👏1🤩1
☕️ 20 идей для пет-проектов на Java

Если хочется прокачать Java не на очередных задачках, а на чем-то, что похоже на реальную разработку — держите подборку идей.

⬇️На карточке — проекты
⬇️разного уровня: от трекера
⬇️расходов и URL Shortener до
⬇️микросервисного
⬇️приложения, real-time
⬇️уведомлений и AI-систем.

Для каждого указан примерный стек

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

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥1
🔖 Тернарный оператор в Java: когда одна строка лучше if-else

Если условие простое и у него всего два результата, необязательно разворачивать полноценный if-else.

Можно использовать тернарный оператор:


String access = age >= 18
? "Проходите!"
: "Доступ запрещён»;


Схема простая:

условие ? значение_если_true : значение_если_false


➡️ Тернарный оператор удобен для коротких присваиваний, return и простых проверок. Но как только появляются несколько условий или вложенные тернарники, компактность начинает работать против читаемости — здесь обычный if-else будет понятнее.

🔗 Источник

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

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤‍🔥2🥰1
📈 Продвинутая Map, часть 2: два ключа вместо вложенности

Если вы хоть раз писали Map<String, Map<String, Integer>>, знаете, насколько быстро такая структура становится неудобной.
Например, продажи по городу и товару:


Map<String, Map<String, Integer>> sales = new HashMap<>();

sales.computeIfAbsent("Москва", k -> new HashMap<>())
.put("iPhone", 120);


А если нужно получить все города, где продавался iPhone? Придётся обходить вложенные Map.

🈶 В Guava для таких случаев есть Table<R, C, V> — структура с двумя ключами:


Table<String, String, Integer> sales = HashBasedTable.create();

sales.put("Москва", "iPhone", 120);
sales.put("Питер", "iPhone", 90);

sales.get("Москва", "iPhone"); // 120


❗️Главное преимущество — можно работать не только со строками, но и со столбцами:


sales.row("Москва");
// {iPhone=120}

sales.column("iPhone");
// {Москва=120, Питер=90}


Есть несколько реализаций под разные задачи:

→ HashBasedTable — hash-таблицы с предсказуемым порядком итерации
→ TreeBasedTable — отсортированные ключи
→ ArrayTable — строки и столбцы известны заранее
→ ImmutableTable — неизменяемая таблица

📌 Если данные естественно описываются парой «строка + столбец», Table может оказаться удобнее вложенных Map.

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

🐸 Библиотека джависта

#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍7🔥43
Чем отличается invokeAll() от submit() в ExecutorService?

→ submit() отправляет одну задачу и сразу возвращает Future. Задача выполняется асинхронно.

→ invokeAll() принимает коллекцию задач и блокирует поток до завершения всех задач. Возвращает список Future только когда все задачи выполнены или вышел таймаут.

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

🐸 Библиотека джависта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥21
⚙️ Spring Boot 4: несколько TaskDecorator для async-задач

Раньше, если нужно было перенести в worker thread сразу несколько контекстов — например, MDC + SecurityContext, приходилось собирать это вручную.

В Spring Boot 4 можно зарегистрировать несколько TaskDecorator:


@Order(1)
class MdcTaskDecorator implements TaskDecorator {
// перенос MDC
}

@Order(2)
class SecurityTaskDecorator implements TaskDecorator {
// перенос SecurityContext
}


Spring Boot сам объединит их в CompositeTaskDecorator и выполнит в заданном порядке.

📌 Полезно для @Async, когда request-контекст должен пережить переход на другой поток.

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

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73
🎮 Инструментарий разработчика

Собрали самые популярные и эффективные инструменты на все случаи жизни.

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

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
💯2
══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
😁17💯2
💡 Java tip: instanceof сразу может привести тип

Раньше после проверки приходилось делать отдельный cast:


if (animal instanceof Dog) {
Dog d = (Dog) animal;
d.bark();
}


🔵 Начиная с Java 16 переменную можно объявить прямо в условии:


if (animal instanceof Dog d) {
d.bark();
}


d уже имеет тип Dog и доступна внутри ветки, где проверка успешна.

🔵 Можно сразу проверять несколько типов:


if (animal instanceof Dog d) {
d.bark();
} else if (animal instanceof Cat c) {
c.meow();
}


📌 Меньше явных cast’ов — меньше лишнего кода и проще читать условие.

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

🐸 Библиотека джависта

#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
SQL Joins.pdf
122.4 KB
Сохраняйте шпаргалку по join'ам в SQL

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

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👾2
Что будет результатом кода

👍 — UnsupportedOperationException на set()

🔥 — UnsupportedOperationException на add()

❤️ — list = [X, B, C, D]

👾 — list = [A, B, C, D]

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

🐸 Библиотека джависта
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥47👍126
🌐 Зачем нужен CDN и как он работает

Когда пользователь из Сиднея открывает ваш сайт, его запрос летит на сервер в Германии и обратно. Это ~300 мс только на «дорогу» — и это для каждого изображения, шрифта, JS-файла.

CDN (Content Delivery Network / Сеть доставки контента) решает эту проблему в лоб: вместо одного сервера — тысячи точек по всему миру. Пользователь получает файлы с ближайшей к нему ноды, а не с вашего origin-сервера.

🔹 Origin и Edge

В архитектуре с CDN появляются два новых понятия:

Origin Server (Главный сервер): это ваш настоящий сервер, где крутится Spring Boot, лежит база данных и хранятся оригиналы всех файлов (например, в Amazon S3).

Edge Servers (Граничные серверы / Точки присутствия - PoP): это тысячи серверов CDN-провайдера (например, Cloudflare или Akamai), раскиданные по всему земному шару: в Сиднее, Токио, Нью-Йорке, Лондоне, Москве.

🔹 Как работает кэш

Первый запрос к конкретному файлу всё равно идёт до origin. CDN его скачивает, кэширует у себя и отдаёт пользователю. Все последующие запросы на тот же файл edge-сервер обрабатывает сам, не трогая ваш бэкенд. Это называется cache hit.

🔹 Что кладем в CDN

CDN идеально подходит для статического контента:

— Картинки, видео, аудио.
— Скомпилированные файлы JavaScript и CSS.
— Шрифты.

CDN не подходит для динамического контента:

— Корзина товаров.
— Приватные данные пользователя.
(Запросы к API /api/v1/users/me должны идти напрямую на ваш сервер, минуя кэш CDN).

🔹 Защита от DDoS

Современные CDN (тот же Cloudflare) - это не просто кэш. Это гигантский щит.

Если хакеры решат «положить» ваш сайт и отправят миллион запросов в секунду, этот удар примут на себя серверы CDN. Их пропускная способность измеряется терабитами. Они отфильтруют «мусорный» трафик, и ваш маленький Origin-сервер даже не заметит атаки.

🔹 Побочные эффекты

Ускорение: пользователи получают тяжелый контент мгновенно, потому что скачивают его из своего же города.

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

Безопасность: CDN скрывает реальный IP-адрес вашего сервера и защищает от DDoS-атак.

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

🐸 Библиотека джависта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
📌 6 принципов безопасности API

API — это не просто интерфейс, а ворота в вашу систему. Без должной защиты они становятся уязвимой точкой для атак.

Ключевые принципы безопасности API:

— Использование HTTPS
— Аутентификация и авторизация
— Ограничение запросов
— Валидация входных данных
— Управление доступом на основе ролей (RBAC)
— Мониторинг и логирование


🔗 Подробнее в статье

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

🐸 Библиотека джависта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🧹 Java научилась отдавать память обратно ОС во время простоя

В августовском обновлении OpenJDK 25 появился time-based heap uncommit для G1 GC.

Если JVM простаивает и часть committed heap больше не нужна, G1 теперь может вернуть эту память операционной системе. Фича включена по умолчанию и управляется G1UseTimeBasedHeapSizing.


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

А заодно Microsoft выпустила свежие сборки:

25.0.4.1, 21.0.12.1, 17.0.20.1 и 11.0.32.1.

🔗 Источник

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

🐸 Библиотека джависта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
🚀 JDK 27 выйдет 15 сентября: что попробовать

До выхода Java 27 осталось меньше месяца. Из того, на что стоит обратить внимание:

🤩 Post-quantum TLS 1.3 — JEP 527 добавляет hybrid key exchange с ML-KEM прямо в JDK. В TLS появляются группы вроде X25519MLKEM768 — без стороннего криптографического провайдера.

🤩 Primitive types в pattern matching — пятый preview JEP 532. instanceof и switch смогут работать с примитивными типами без прежних обходных решений.

🤩 Structured Concurrency продолжает эволюционировать как preview API для управления группами связанных задач и их отменой.

А пока можно уже смотреть JDK 28 Early Access — там развивается Valhalla с Value Classes and Objects, а JSON API пока остаётся экспериментальной/incubating частью.

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

🐸 Библиотека джависта
Please open Telegram to view this post
VIEW IN TELEGRAM
3
══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
Please open Telegram to view this post
VIEW IN TELEGRAM
😁15🌚2
🧩 Record — это не просто контейнер для данных

Создали record:


record Vehicle(String year, String make, String model) {}

var car = new Vehicle("2020", "Toyota", "Camry»);


И Java сразу даёт несколько методов.

🤩 Доступ к компонентам — прямо по их именам:

car.year(); // "2020"
car.make(); // "Toyota"
car.model(); // "Camry"

Не getYear(), а именно year() — это одна из особенностей records.

🤩 toString() генерируется автоматически:


System.out.println(car);

// Vehicle[year=2020, make=Toyota, model=Camry]


🤩 equals() сравнивает records по значениям компонентов:


var car1 = new Vehicle("2020", "Toyota", "Camry");
var car2 = new Vehicle("2020", "Toyota", "Camry");

car1.equals(car2); // true


И автоматически генерируется соответствующий hashCode().

То есть record уже из коробки даёт удобную модель «данные + value-based equality», а не просто сокращённую запись класса.

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

🐸 Библиотека джависта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1