javatg | Unsorted

Telegram-канал javatg - Java

17202

Самая актуальная информация из мира Java По всем вопросам- @haarrp @itchannels_telegram - 🔥лучшие ит-каналы @pythonl - 🐍 @ai_machinelearning_big_data- ml @ArtificialIntelligencedl - AI @datascienceiot - ds @pythonlbooks 📚 РКН: clck.ru/3FmwKr

Subscribe to a channel

Java

Хватит склеивать строки через плюс: как в Java собирать сообщения читаемо

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


String name = "Ada";
int score = 98;

// трудно читать, когда полей становится больше
String msg = "Player " + name + " scored " + score + " points";

// шаблон отдельно, значения отдельно
String msg2 = String.format("Player %s scored %d points", name, score);

// то же самое короче, Java 15+
String msg3 = "Player %s scored %d points".formatted(name, score);

// для локализации
String i18n = MessageFormat.format("Player {0} scored {1} points", name, score);


В String.format шаблон целиком виден сразу, а поля легко добавить или переставить, не трогая остальную строку. MessageFormat пригодится, когда тексты лежат в ResourceBundle и для разных языков порядок слов меняется: индексы {0} и {1} позволяют переставлять аргументы прямо в переводе.

У MessageFormat есть подвохи. Числа он форматирует по локали, поэтому 1234 превратится в "1,234". А одинарная кавычка там служебный символ, так что "don't" нужно писать как "don''t".

И про производительность: начиная с Java 9 конкатенация через + компилируется в invokedynamic и работает быстро, а String.format заметно медленнее, потому что каждый раз разбирает шаблон. В горячих циклах и логах на каждый запрос лучше оставить плюс или StringBuilder, а format использовать там, где важна читаемость.

Читать полностью…

Java

🍃 Не раскладывайте весь Spring-проект по папкам controller, service и repository.

В новом This Week in Spring Джош Лонг советует группировать код по функциональности, используя подход Spring Modulith. Например, orders, payments, users, внутри которых находятся относящиеся к ним слои.

Ещё в подборке:

• JobRunr 9: поиск упавшего шага и задач, вызывающих замедление, остановка выполнения без потери работы.
• Spring AI: разбор агентных паттернов и вызова инструментов от руководителя проекта Кристиана Цолова.
• Progen CLI: видео о генерации каркаса приложения.
• IntelliJ IDEA: обзор новых возможностей.
• A Bootiful Podcast: разговор с создателем Jenkins Косуке Кавагути.

https://spring.io/blog/2026/10/13/this-week-in-spring-october-13th-2026

#Java #SpringBoot

Читать полностью…

Java

💡 Описывайте состояния через enum вместо строк

Статусы вроде "pending" и "finished" легко сломать опечаткой. Enum задаёт явный набор состояний и делает код понятнее.

✅ Именованные значения вместо «магических» строк.
✅ Правила допустимых переходов рядом с описанием состояний.
✅ В языках с проверкой полноты switch компилятор подскажет, если вы забыли обработать состояние.

Но enum сам по себе не запрещает неверные переходы. Правило «отменённый заказ нельзя отправить» нужно реализовать отдельно.

Читать полностью…

Java

💡 Java: почему месяц `5` может оказаться июнем

В Calendar месяцы нумеруются с нуля: январь 0, май 4, июнь 5. Простая ловушка, которая легко превращается в баг.

Начиная с Java 8, для нового кода выбирайте java.time:


LocalDate date = LocalDate.of(2026, 5, 31);
LocalDate deadline = date.plusDays(7);

String text = deadline.format(
DateTimeFormatter.ISO_LOCAL_DATE
);
// 2026-06-07


Здесь 5 означает май, а plusDays() возвращает новый объект, сохраняя исходную дату. Основные типы java.time неизменяемы и безопасны для совместного использования потоками.

Помните: `LocalDateTime` не содержит часового пояса. Для однозначного момента события используйте Instant или задавайте пояс явно.

Читать полностью…

Java

💡 Предпочитайте делегирование наследованию

Связь is-a выглядит удобно: создаём подкласс, наследуем поведение и пишем меньше кода.

Но есть цена.

✅ Подкласс получает весь API родителя.
✅ Он зависит от деталей реализации суперкласса.
✅ Изменение родительского класса может неожиданно сломать потомка.

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

Часто безопаснее композиция:


class OrderService {
private final PaymentService paymentService;
}


Вместо наследования:


class OrderService extends PaymentService {
}


Композиция связывает объекты. Наследование связывает их судьбы.

Если объекту просто нужна чужая функциональность, чаще лучше её делегировать, а не наследовать.

Читать полностью…

Java

⚡️ Spring Boot 4 убрал статус WILL_EXPIRE_SOON: проверьте мониторинг сертификатов

В Spring Boot 3 SSL-компонент health endpoint переходил в особый статус WILL_EXPIRE_SOON, если сертификат скоро истекал. Для проб Kubernetes и балансировщиков это было неудобно: непонятно, считать сервис живым или нет.

В Spring Boot 4 этот статус убрали. Health остаётся UP, а цепочки сертификатов, срок которых скоро закончится, перечисляются в details.expiringChains. Порог предупреждения задаётся свойством management.health.ssl.certificate-validity-warning-threshold:


management:
health:
ssl:
certificate-validity-warning-threshold: 14d
endpoint:
health:
show-details: always


Ответ /actuator/health тогда выглядит так:


{
"status": "UP",
"details": {
"expiringChains": ["server-cert…"]
}
}


Практический вывод простой: пробы больше не будут дёргаться из-за истекающего сертификата, но и алерт по смене статуса тоже не сработает. Если мониторинг ловил WILL_EXPIRE_SOON, переключите его на проверку непустого expiringChains и не забудьте включить show-details, иначе деталей в ответе не будет.

Читать полностью…

Java

⚡️Продвинутый Java-совет: используйте `ClassValue`

Если нужно кешировать метаданные отдельно для каждого класса, не обязательно создавать ConcurrentHashMap<Class<?>, Metadata>.


private static final ClassValue<Metadata> CACHE =
new ClassValue<>() {
@Override
protected Metadata computeValue(Class<?> type) {
return scan(type);
}
};

Metadata metadata = CACHE.get(MyClass.class);


ClassValue лениво вычисляет значение, безопасно работает при конкуренции потоков и хранит отдельный результат для каждого Class. Сбросить кеш можно через remove().

Полезно для reflection, сериализации, мапперов и собственных фреймворков.

#Java #JavaTips #Backend

Читать полностью…

Java

Spring Boot 4: как перенести старые настройки

При обновлении добавьте временную зависимость:


runtimeOnly("org.springframework.boot:spring-boot-properties-migrator")


После запуска приложения migrator:

* найдёт устаревшие и переименованные параметры;
* выведет подсказки в логах;
* временно преобразует старые ключи во время выполнения.

Исправьте настройки в application.properties или application.yaml, убедитесь, что предупреждения исчезли, и удалите зависимость. Оставлять её в проекте постоянно не нужно.

#SpringBoot4 #Migration


При обновлении добавьте временную зависимость:


runtimeOnly("org.springframework.boot:spring-boot-properties-migrator")


После запуска приложения migrator:

* найдёт устаревшие и переименованные параметры;
* выведет подсказки в логах;
* временно преобразует старые ключи во время выполнения.

Исправьте настройки в application.properties или application.yaml, убедитесь, что предупреждения исчезли, и удалите зависимость. Оставлять её в проекте постоянно не нужно.

#SpringBoot4 #Migration

Читать полностью…

Java

🚀 Anthropic представила Claude Opus 5.5

Новая флагманская модель стала сильнее Opus 5, при этом работает быстрее и дешевле.

Что изменилось:

- сильнее в агентном программировании, computer use и knowledge work
- лучше справляется с длинными задачами и большими кодовыми базами
- ответы стали короче и естественнее
- улучшена устойчивость к prompt injection
- Anthropic заявляет примерно на 40% более низкую стоимость на типичных задачах и более чем на 30% более быструю генерацию

Из примеров:
- один из ранних тестеров провёл миграцию 680 000 строк кода менее чем за день
- в тесте Anthropic модель переписала HAProxy с C на Rust за 9,5 часа

Цена API:
- $4 / 1M входных токенов
- $20 / 1M выходных токенов
- $0,20 / 1M токенов при чтении кеша

Бенчмарки:
- Terminal-Bench 4.0 — 66,4%
- FrontierCode v1.1 — 54,4%
- Humanity’s Last Exam — 67,7% с инструментами

Также Anthropic подтвердила, что Claude Sonnet 5.5 и Haiku 5.5 выйдут в ближайшие недели.

https://www.anthropic.com/claude-opus-5-5

Читать полностью…

Java

🚀 JetBrains обновила roadmap Kotlin: главный фокус - Multiplatform, Wasm и удобство разработки

Что сейчас в приоритете:

- довести Kotlin/Wasm до Stable
- ускорить KAPT до уровня Java APT
- улучшить incremental compilation в K2
- сделать новый JVM reflection
- перевести wasm-wasi на WASI Preview 2 и добавить Component Model
- продвинуть Swift Export из Alpha в Beta
- улучшить Xcode integration и Kotlin/Native debugger
- добавить импорт Swift Package Manager пакетов
- развивать Kotlin LSP и поддержку VS Code
- выпустить единый Kotlin Toolchain
- добавить first-class поддержку JPA/Hibernate для Kotlin stdlib types
- стабилизировать kotlinx.serialization, kotlinx.collections.immutable и kotlinx-io
- выпустить Kotlin DataFrame 1.0
- добавить HTTP/3 и gRPC в Ktor

Из уже завершённого: Swift 6.3 support, multi-module compilation для Kotlin/Wasm, Navigation3 для Compose Multiplatform и 18-месячное окно security fixes для stdlib.

Главное направление видно очень чётко: Kotlin всё сильнее двигается в сторону полноценной кроссплатформенной экосистемы — JVM, iOS, WebAssembly и web.

Следующее обновление roadmap запланировано на февраль 2027.

https://kotlinlang.org/docs/roadmap.html

Читать полностью…

Java

🚀 Spring Boot 4 получил отдельный starter для RestClient

Теперь imperative HTTP-клиент можно подключать через:

spring-boot-starter-restclient

Для реактивного WebClient используется:

spring-boot-starter-webclient

А настройки HTTP-клиентов собраны под единым префиксом:

spring.http.clients.*

То есть конфигурация стала понятнее, а выбор между imperative и reactive подходом — более явным.

#SpringBoot4 #RestClient #Java

Читать полностью…

Java

🚀 Spring Boot 4 получил полноценную поддержку Kotlin Serialization

Теперь для kotlinx.serialization есть отдельный starter:

spring-boot-starter-kotlinx-serialization-json

Что он делает:

- автоматически создаёт Json bean
- регистрирует HTTP message converter
- позволяет настраивать сериализацию через spring.kotlinx.serialization.json.*
- работает с привычными @Serializable data class

Пример настройки:

pretty-print: true
ignore-unknown-keys: true

Для Kotlin-проектов на Spring Boot это убирает лишнюю ручную конфигурацию и делает kotlinx.serialization полноценной альтернативой Jackson.

#SpringBoot4 #Kotlin

Читать полностью…

Java

☕ Java добралась до GPU Tensor Cores почти без потери производительности

В Project Babylon показали, как один и тот же Java Tensor API можно запускать на разных GPU через HAT — без переписывания логики под каждого производителя.

На NVIDIA A10:

- обычный matrix multiply: около 240 GFLOP/s
- через Tensor Cores: до 7,3 TFLOP/s
- производительность приблизилась к native CUDA/WMMA

На Apple M4 Max тот же Java-код запускается через OpenCL 1.2, а после настройки tile size и параметров запуска получил до 8× ускорения относительно наивной реализации.
Под капотом:

- Project Babylon даёт code reflection
- HAT преобразует Java-код под GPU backend
- Tensor API абстрагирует MMA-операции
- NVIDIA получает аппаратные Tensor Cores, а другие платформы — эквивалентное tiled-исполнение

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

https://social.ora.cl/6011BEbmLc

Читать полностью…

Java

Команды ждут тебя на треке программирование роботов на МТС True Tech Champ 2026  — всероссийском чемпионате по программированию с двумя треками и призовым фондом 10 250 000 рублей.

Успей зарегистрироваться до 13 сентября.

В треке программирования роботов тебе предстоит запрограммировать робособаку для доставки груза через полосу препятствий сначала в онлайн-симуляторе, а затем на офлайн-полигоне в финале 22 октября. Рекомендуемые стеки: Go, Java, Python, C#, C++, JS.

Участие в командах 2-5 человек. Если у тебя нет своей команды, кураторы помогут объединиться с другими участниками на платформе.

Масштабный финал объединит борьбу за призовой фонд 10 250 000 рублей, выступления хедлайнеров, доклады спикеров и активности для всех гостей мероприятия.

Успей зарегистрироваться и пройти квалификацию до 13 сентября.

erid:2VSb5xPaMKx

Читать полностью…

Java

💡 Java: переопределяешь `equals()` - переопредели и `hashCode()`

Два объекта с одинаковым email могут быть равны по equals(), но HashSet.contains() при этом вернёт false.

Причина: HashSet и HashMap сначала используют хеш, чтобы определить, где искать объект, а затем проверяют равенство. Если хеши различаются, до equals() дело может не дойти.

Правило: равные объекты обязаны иметь одинаковый `hashCode()`. При этом одинаковый хеш не гарантирует равенство - коллизии допустимы.

В примере на картинке равенство определяется по email, поэтому хеш тоже вычисляется по нему.

И ещё: не меняйте поля, участвующие в `equals()` и `hashCode()`, пока объект хранится в `HashSet` или используется как ключ `HashMap` - поиск может перестать его находить.

#Java #OOP

Читать полностью…

Java

🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку

Окружение решает больше, чем кажется.

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

AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: /channel/+90Z5TAyfuNU5YmRi
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_ci
Java: t.me/java_library
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: /channel/gamedev
Haskell: t.me/haskell_tg

Собеседования и карьера:

DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview

Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: /channel/addlist/2Ls-snqEeytkMDgy
Папка Frontend: /channel/addlist/mzMMG3RPZhY2M2Iy

Полезное сверху:

ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: /channel/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: /channel/addlist/BkskQciUW_FhNjEy

Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg

Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.

Читать полностью…

Java

💡 100% покрытия тестами ≠ код без багов

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

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

✅ Проверяйте результат, а не только выполнение.
✅ Тестируйте рискованные сценарии и обработку ошибок.
✅ Используйте покрытие, чтобы искать пробелы в тестах.

Тест, который ловит реальный баг, ценнее красивой цифры в отчёте.

Читать полностью…

Java

💡 Код работает на обычных данных? Проверьте, что происходит на границах.

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

✅ `null`: метод корректно обрабатывает отсутствие значения или неожиданно падает с NullPointerException?

✅ Пустая коллекция: что вернёт код, если обрабатывать нечего?

✅ Один элемент: работает ли логика без второго элемента и соседних значений?

✅ Границы: проверьте минимум, максимум и значения сразу за ними. Например, для диапазона 1–100: 0, 1, 100, 101.

Такие тесты ещё и документируют контракт: какие входные данные допустимы, что возвращается и когда ожидается исключение.

Проверяйте не только «всё прошло успешно», но и «что будет, если…».

Читать полностью…

Java

🚀 Spring Boot 4: переименовали property для exception translation

Было:

spring.dao.exceptiontranslation.enabled

Стало:

spring.persistence.exceptiontranslation.enabled

Функциональность та же: Spring продолжает переводить persistence-исключения в DataAccessException для @Repository.

Чтобы не пропустить такие изменения при миграции на Boot 4, подключите Spring Boot Properties Migrator — он покажет устаревшие и переименованные настройки.

Мелочь, которая легко ломает конфиг после обновления.

Читать полностью…

Java

🧠 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

💡 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

Kotlin 2.5.0-Beta1 вышел

JetBrains выпустила первую бета-версию Kotlin 2.5.0.

Главное:

- Language: стабильная name-based destructuring в only-syntax режиме, плюс экспериментальные companion extensions и blocks.
- Standard Library: новые экспериментальные функции для упрощения типичных конструкций с if.
- Kotlin/JS: добавлена поддержка target ES2020.
- Compiler: более предсказуемое поведение inline-функций при компиляции .klib.

Пока это Beta, но релиз уже показывает, в какую сторону движется Kotlin 2.5: меньше синтаксического шума, современнее JS-таргеты и более стабильное поведение компилятора.

https://kotl.in/2-5-0-beta1

Читать полностью…

Java

⚡️⚡️Joker 2026: что происходит с профессией разработчика

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

Поэтому в этом сезоне меняется и Joker: первый день традиционно посвящен Java — Core Java, рантайму и работе на уровне железа. А во второй день будем обсуждать, как прямо сейчас меняется сама инженерная практика.

В программе — Context Engineering, команды из людей и ИИ-агентов, Self-Evolving Agents, новые подходы к архитектуре и работе с моделями, а также вопросы ответственности и роли эксперта.

Собрали главные темы второго дня в карточках.

🌟С промокодом: javatg1 персональные билеты дешевле

Полное расписание и билеты — на сайте.

Читать полностью…

Java

Как дать ИИ-агенту доступ к корпоративным данным и ничего не сломать

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

На встрече Архитектурного клуба Даниил Смирнов, руководитель службы бэкенд-разработки Антиспама Яндекс 360, покажет весь контур системы: оркестратор, инструменты, память, EVAL и наблюдаемость.

Помимо обзора архитектуры на встрече разберут:

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


📅 6 октября, 17:00 мск
💻 Онлайн, бесплатно

→ [Зарегистрироваться]

Читать полностью…

Java

Apache Kafka курс 2026: бесплатный курс по Kafka с нуля до профи на русском

Kafka обучение без воды: каждый модуль состоит из понятной теории, схем, команд, которые можно запустить у себя, типичных ошибок и вопросов для самопроверки. Курс подходит, чтобы выучить Kafka с нуля, подготовиться к собеседованию на backend, data engineer или DevOps-позицию и спроектировать надёжную систему на Kafka в продакшене.

https://github.com/justxor/KAFKAFREECOURSR

Читать полностью…

Java

💡 Java: Checked vs Unchecked Exceptions, коротко и по делу

В Java исключения делятся на две основные категории:

- Checked - например, IOException. Компилятор заставит либо обработать исключение через try/catch, либо указать throws.
- Unchecked — наследники RuntimeException. Обязательной обработки на этапе компиляции нет.

Пример:

IOException → checked
NullPointerException → unchecked
IllegalArgumentException → unchecked

Практическое правило: checked exceptions имеет смысл использовать для ситуаций, из которых вызывающий код действительно может восстановиться.

#Java #ErrorHandling

Читать полностью…

Java

🔥 Хочешь расти в IT быстрее остальных? Перестань учиться в одиночку

Можно годами смотреть курсы, читать документацию и всё равно топтаться на месте.

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

Я собрал папки и каналы по разным направлениям IT, чтобы ты быстрее находил нужных людей, идеи и полезный контент - без бесконечного поиска.

AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: /channel/+90Z5TAyfuNU5YmRi
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_ci
Java: t.me/javatg
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: /channel/gamedev
Haskell: t.me/haskell_tg

Собеседования и карьера:

DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview

Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: /channel/addlist/2Ls-snqEeytkMDgy
Папка Frontend: /channel/addlist/mzMMG3RPZhY2M2Iy

Полезное сверху:

ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: /channel/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: /channel/addlist/BkskQciUW_FhNjEy

Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg

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

Читать полностью…

Java

Java: рефакторинг legacy-кода начинай с теста

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

* Добавь тест на текущее поведение. Проверь обычный сценарий и важные граничные случаи.
* Меняй по одному шагу: переименуй переменную, выдели метод, упрости условие.
* После каждого изменения запускай тесты. Если что-то сломалось, причину проще найти в небольшом изменении.
* Исправления багов отделяй от рефакторинга. Изменение поведения лучше делать отдельным шагом с отдельным тестом.

Переписывание целого класса без покрытия усложняет проверку: код выглядит лучше, но сохранил ли он прежнее поведение?

Читать полностью…

Java

🍃 Spring Boot 4: проверьте зависимости Flyway и Liquibase

После обновления одной зависимости flyway-core или liquibase-core недостаточно для автоконфигурации миграций. В Spring Boot 4 поддержку технологий вынесли в отдельные модули.

Используйте соответствующий стартер:

* Flyway → spring-boot-starter-flyway
* Liquibase → spring-boot-starter-liquibase

Для тестов, включая test slices:

* spring-boot-starter-flyway-test
* spring-boot-starter-liquibase-test

Все перечисленные зависимости относятся к группе org.springframework.boot. Тестовые стартеры добавляются с областью test в Maven или через testImplementation в Gradle.

Руководство по миграции: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide#module-dependencies

#SpringBoot #Java #Flyway

Читать полностью…

Java

🚀 Apache Kafka - это распределённая платформа для передачи и хранения потоков событий в реальном времени.

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

В 2026 Kafka используют для:

• связи микросервисов
• логов и событий
• real-time аналитики
• CDC из баз данных
•• обработки больших потоков данных
построения event-driven архитектуры

Главная причина популярности: высокая пропускная способность, масштабирование и возможность надёжно хранить события и перечитывать их позже.
https://www.youtube.com/shorts/Z-t8CCs7ty4

Читать полностью…
Subscribe to a channel