TGViewer
Channel Public Channel
Библиотека джависта | Java, Spring, Maven, Hibernate

Библиотека джависта | Java, Spring, Maven, Hibernate

@javaproglib

Все самое полезное для Java-разработчика в одном канале.

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Subscribers
22K
Photos
2.5K
Videos
57
Links
3.7K

Showing posts older than #7834 · Back to latest

Older Posts 20 shown
Post #7833 2.63K
💡 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
  • 👍 12
Post #7830 2.51K
⚙️ 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
  • 👍 7
  • ❤ 3
Post #7829 2.51K
Чем отличается invokeAll() от submit() в ExecutorService?

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

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

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

🐸 Библиотека джависта
  • 👍 8
  • 🔥 2
  • ❤ 1
Post #7828 2.6K
📈 Продвинутая 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
  • 👍 7
  • 🔥 4
  • ❤ 3
Post #7826 2.65K
🔖 Тернарный оператор в Java: когда одна строка лучше if-else

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

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


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


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

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


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

🔗 Источник

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

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

#Enterprise
  • 👍 9
  • ❤‍🔥 2
  • 🥰 1
Post #7825 2.72K
☕️ 20 идей для пет-проектов на Java

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

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

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

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

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

#Enterprise
  • 👍 4
  • ❤ 3
  • 🔥 1
Post #7824 2.4K
💡 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
  • 👍 5
  • ❤ 2
  • 👏 1
  • 🤩 1
Post #7822 2.71K
🛡 Circuit Breaker & Resilience4j

В микросервисах падение одного сервиса может уронить всю систему — эффект «домино». Circuit Breaker помогает изолировать сбои и держать SLA под контролем.

Промпт:

Generate a Spring Boot 3 configuration with Resilience4j Circuit Breaker.

— Configure Circuit Breaker around external HTTP calls (e.g. RestTemplate/WebClient).
— Add Retry policy with exponential backoff.
— Add Rate Limiter and Bulkhead isolation (thread pool separation).
— Provide fallback methods (graceful degradation).
— Enable metrics collection with Micrometer and Prometheus.
— Expose actuator endpoints for circuit state monitoring.
— Add chaos testing scenario: simulate latency and failures.


💡 Расширения:

— Настройте TimeLimiter для защиты от зависаний.
— Интегрируйте с Spring Cloud Gateway для глобальных политик.
— Добавьте Grafana dashboards для визуализации отказоустойчивости.

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

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

#Enterprise
  • 👍 3
  • 🤔 2
  • ❤ 1
Post #7820 2.49K
🆕 Java Digest: паттерны, микросервисы и Jackson 3

Топ-3 статьи о Java и смежных технологиях за неделю по версии нашего канала.

1️⃣ Порождающие шаблоны на Java

Разбор Factory, Builder, Singleton и др. с практическими примерами. Главная мысль — паттерны нужны там, где реально упрощают код, а не ради “красоты”.

2️⃣ Как hh.ru выносили микросервис из монолита

Из монолита выделяли чат-сервис. Год миграции, дублирование логики, проблемы с транзакциями — но результатом стал независимый модуль и гибкость для дальнейшей разработки.

3️⃣ Jackson 3 приходит в Spring

Поддержка Java 17+, новый JsonMapper, null-safety, совместимость со Spring Boot 4. Jackson 2 уходит в прошлое — пора проверять зависимости.

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

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

#News
  • ❤ 1
  • 👍 1
  • 🥱 1
Post #7819 2.17K
🎯 IntelliJ IDEA: Bookmarks и Context Bookmarks

Большие проекты → десятки файлов → сотни классов. Иногда нужно быстро вернуться к «тем самым» местам в коде. В ход идут Bookmarks — и особенно Context Bookmarks.

🔹 Что делает

— Позволяет отмечать строки или файлы как закладки
— Поддерживает нумерацию (быстрый переход по цифре)
— Context Bookmarks автоматически привязывают закладки к рабочему контексту (ветке, задаче)

🔹 Зачем это нужно

— Удобно при отладке: отмечаете подозрительные места и прыгаете между ними
— Можно держать список TODO прямо в коде, без комментариев
— Context Bookmarks запоминают, что именно важно для текущей задачи, и не мешают в будущем

🔹 Как использовать

— Обычная закладка: F11 (Windows/Linux) или F3 (macOS)
— Закладка с номером: Ctrl+Shift+<цифра> (Windows/Linux) или ⌘⇧<цифра> (macOS)
— Быстрый переход: Ctrl+<цифра>
— Context Bookmarks: активируются в View → Tool Windows → Bookmarks

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

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

#Enterprise
  • 👍 5
  • 🔥 1
  • 🥱 1
Post #7818 1.8K

Forwarded from Proglib.academy | IT-курсы

🤔 У большинства разработчиков уже есть подписки на IDE, GitHub Copilot, Claude, ChatGPT или облачные сервисы.

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


Такой формат недавно появился и в Proglib Academy. Вместо одного курса — доступ сразу ко всей библиотеке и новым материалам, которые появляются в подписке 😎

🔗 Подробнее

🏃‍♀️ Proglib Academy
  • 😁 2
  • ❤ 1
Post #7817 1.98K
Кажется, у онлайн-обучения появился формат, которого давно не хватало 👇
Post #7816 2.13K
⚡️ Просто о сложном: как JIT делает код быстрее

Вы когда-нибудь задумывались, как JIT умеет так ловко оптимизировать код в реальном времени?

Сегодня разберём, какие именно суперспособности JIT даёт вашему коду.

🔴 Инлайнинг методов

Когда JIT обнаруживает, что какой-то метод выполняется слишком часто, он может инлайнить его. Это значит, что весь код метода не будет вызываться отдельно, а его инструкции будут вставляться прямо в место вызова.

Пример:


int sum(int a, int b) {
return a + b;
}

int result = sum(5, 10);


Стало:


int result = 5 + 10; // JIT инлайнит код метода sum


🔴 Удаление мертвого кода

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

🔴 Оптимизация циклов

Циклы — частая конструкция, и JIT всегда старается оптимизировать их выполнение. Например, если цикл выполняется много раз, JIT может переработать его для уменьшения количества операций.

🔴 Параллельная компиляция

Если ранее компиляция шла поэтапно, сейчас JIT может компилировать несколько частей программы одновременно. Это не только ускоряет работу компилятора, но и уменьшает задержки при запуске программы.

🔴 Использование final переменных

JIT предполагает, что final переменные не изменяются после инициализации. Это даёт компилятору возможность предсказать их значения и оптимизировать операции с ними.

🔴 Удаление лишних проверок

JIT понимает, какие проверки в коде избыточны. Например, если переменная была уже проверена на null, и это значение не изменяется, JIT может просто игнорировать повторные проверки.

🔴 Классификация горячих и холодных методов

JIT следит за тем, какие методы выполняются часто (горячие) и какие — нет (холодные). Он решает компилировать только те методы, которые чаще всего используются. Если горячий метод вдруг перестаёт быть горячим, JIT может освободить его от компиляции, освобождая ресурсы.

🔴 Слияние и удаление дубликатов

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

Пример:


int a = 5;
int b = 5;
int c = a + b;
int d = a + b; // Дублирование


JIT может понять, что a + b одинаково для обеих операций, и просто использовать результат из первого вычисления во втором.

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

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

#CoreJava
  • 👍 8
  • 😁 2
  • ❤ 1
  • 🥱 1
Post #7815 2.25K
👑 Магия IntelliJ IDEA: Быстрый запуск и остановка проекта

Всё ещё запускаете проект мышкой? Тогда этот пост для вас.

На самом деле IDEA умеет стартовать, дебажить и останавливать приложение полностью без кликов мышью. После пары дней привычки вы забудете, где находится зелёная кнопка ▶️

🔵 Что делает

— Позволяет запускать и останавливать проект, не касаясь мыши
— Работает с любыми конфигурациями: Application, Maven, Gradle, Spring Boot и др.
— Поддерживает горячий перезапуск (rerun) и мгновенный переход к дебагу

🔵 Зачем это нужно

— Ускоряет цикл «правка → запуск → проверка»
— Позволяет фокусироваться на коде, не отвлекаясь на интерфейс
— Особенно удобно при работе на ноутбуке или в tmux-подобном флоу

🔵 Как использовать


▶️ Shift + F10 — запустить последнюю конфигурацию
🐞 Shift + F9 — запустить в режиме отладки
⏹️ Ctrl + F2 — остановить выполнение


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

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

#Enterprise
  • 🥱 9
  • 👍 2
  • 🤔 1
Post #7811 2.28K
🧬 Value Objects — зачем нужен Project Valhalla

JEP 401 (Value Objects) предложили включить в preview для JDK 28. Это один из ключевых результатов многолетнего проекта Valhalla.

❇️ В чём идея:

Сегодня почти любой пользовательский тип в Java — это объект с идентичностью: отдельная аллокация, заголовок объекта и работа через ссылку.

Value Objects отказываются от идентичности и описываются только своим состоянием.

Благодаря этому JVM получает больше свободы для оптимизаций: может хранить такие объекты компактнее, уменьшать количество аллокаций и снижать нагрузку на GC.


❇️ Что это даёт:

— Более эффективное хранение данных.
— Меньше накладных расходов на память и сборку мусора.
— Производительность, которая во многих случаях может приблизиться к примитивам.

Цена — отсутствие объектной идентичности: нельзя использовать synchronized, полагаться на System.identityHashCode() и другие identity-зависимые механизмы.

💡 Если коротко: record сделал работу с данными удобнее, а Value Objects делают её ещё и эффективнее на уровне JVM.

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

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

#CoreJava
  • 🙏 7
  • 👍 5
  • ❤ 2
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →