Java Portal | Программирование
11.6K subscribers
1.59K photos
119 videos
45 files
1.65K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
🚀 Spring Boot 4: переименовано свойство преобразования исключений

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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
💡 Предпочитайте делегирование наследованию: отношение «является» тесно связывает ваш класс с суперклассом.

✅ Подкласс наследует весь доступный API родителя, поэтому изменения в родительском классе могут сломать ваш код.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
💡 Тестируйте крайние случаи: null, пустые значения и границы часто скрывают баги

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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
План изучения Java за 6–12 месяцев в эпоху ИИ

Этап 1. Java и основы программирования
• Что такое Java и где она применяется.
• Установка JDK и настройка IDE.
• Синтаксис и структура программы.
• Переменные, типы данных и операторы.
• Условия, switch и циклы.
• Использование ИИ для объяснения концепций Java и ошибок.

Этап 2. Объектно-ориентированное программирование
• Классы и объекты.
• Инкапсуляция.
• Наследование.
• Полиморфизм.
• Абстракция.
• Интерфейсы.
• Визуализация связей между классами с помощью ИИ.

Этап 3. Основные возможности Java
• Массивы и коллекции: List, Set, Map.
• Дженерики.
• Обработка исключений.
• Работа с файлами и вводом-выводом.
• API даты и времени.
• Лямбда-выражения и Stream API.
• Рефакторинг с помощью ИИ.

Этап 4. Память и основы производительности
• Архитектура JVM.
• Heap и stack.
• Основы сборки мусора.
• Утечки памяти.
• Основы профилирования.
• Анализ проблем производительности с помощью ИИ.

Этап 5. Многопоточность и конкурентность
• Потоки и Runnable.
• Executor Framework.
• Синхронизация.
• Блокировки и конкурентные коллекции.
• CompletableFuture.
• Предотвращение гонок данных и взаимных блокировок.

Этап 6. Базы данных и хранение данных
• Основы JDBC и SQL.
• Hibernate и JPA.
• Связи между сущностями.
• Транзакции.
• Основы кеширования.
• Оптимизация запросов с помощью ИИ.

Этап 7. Бэкенд-разработка на Java
• Основы Spring Boot.
• Разработка REST API.
• Контроллеры и сервисы.
• Внедрение зависимостей.
• Валидация.
• Управление конфигурацией.
• Документирование API: Swagger/OpenAPI.
• Генерация API с помощью ИИ.

Этап 8. Безопасность и аутентификация
• Основы Spring Security.
• Аутентификация с JWT.
• Концепции OAuth 2.0.
• Управление доступом на основе ролей.
• Хеширование паролей.
• Безопасная работа с конфигурацией.

Этап 9. Тестирование, DevOps и развёртывание
• Unit-тесты: JUnit и Mockito.
• Интеграционные тесты.
• Maven и Gradle.
• Контейнеризация Java-приложений с Docker.
• CI/CD.
• Основы развёртывания в облаке.
• Генерация тестов с помощью ИИ.

Этап 10. Продвинутая Java и архитектура
• Микросервисная архитектура.
• Взаимодействие сервисов.
• Кеширование с Redis.
• Брокеры сообщений: Kafka и RabbitMQ.
• Событийно-ориентированные системы.
• Мониторинг приложений.
• Настройка производительности.

Этап 11. Практические проекты
• Бэкенд с REST API.
• Система аутентификации.
• Бэкенд интернет-магазина.
• Система на микросервисах.
• Java-приложение, развёрнутое в облаке.
• Настройка логирования и мониторинга.

Этап 12. Подготовка к работе
• Подготовка к Java-собеседованиям.
• Основы алгоритмов и структур данных.
• Основы проектирования систем.
• Практики чистого кода.
• Умение объяснять, как вы используете ИИ в разработке.
• Привычка постоянно учиться.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
🚀 Spring Boot 4: EnvironmentPostProcessor сменил пакет

✅ Новый: org.springframework.boot.EnvironmentPostProcessor
✅ Старый пакет временно сохранён, но помечен как устаревший.
✅ Обновите импорты в коде и регистрацию в spring.factories.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Prompt Engineering и Context Engineering

Prompt Engineering — проектирование инструкций для LLM, чтобы получать более качественные ответы. Главная задача — понять, как инструкции влияют на поведение модели.

1. Структура промпта:
Роль + Контекст + Ограничения + Формат ответа.
Пример:
«Ты опытный Java-архитектор. Объясни JWT-аутентификацию простым языком для начинающих. Оформи ответ списком».

2. Типы промптов:
• Zero-shot — задача без примеров.
• Few-shot — задача с примерами.
• Chain-of-thought — побуждение модели решать задачу пошагово.
• Structured prompting — запрос ответа в заданном формате, например JSON по определённой схеме.

3. Context Engineering:
Качество работы AI зависит не только от формулировки запроса, но и от того, какую информацию и возможности получает модель:
• Поиск и извлечение релевантных данных — retrieval.
• Память.
• Организация рабочего процесса — workflows.
• Инструменты.
• Системные инструкции.

Что важно для реальных проектов: Одних удачных промптов недостаточно для масштабирования AI-систем. В продакшене нужны продуманная архитектура, качественный retrieval, управление памятью и проверка результатов.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
💡 Измеряйте покрытие кода тестами, но не гонитесь за 100%.

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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Виртуальные потоки в Java 21+ хорошо подходят для задач, которые большую часть времени проводят в ожидании.

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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
💡 Spring Boot 4: DevTools больше не запускает сервер LiveReload по умолчанию

✅ Автоматический перезапуск приложения при изменениях в classpath работает как раньше.
✅ Для включения LiveReload задайте spring.devtools.livereload.enabled=true.
✅ Порт 35729 больше не занимается автоматически — удобно, когда на одной машине запущено несколько приложений.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🔥1
Многопоточность в Java: volatile, Atomic и synchronized

Все три механизма применяются при работе с общими данными из нескольких потоков, но дают разные гарантии. Неправильный выбор может привести к багам, которые сложно воспроизвести.

Коротко:
• volatile — видимость изменений и гарантии порядка.
• Atomic — атомарные операции над отдельной переменной.
• synchronized — взаимное исключение и видимость изменений.

volatile: когда важна видимость

Подходит, например, для флага остановки:
private volatile boolean running = true;

// Один поток:
running = false;

// Другой поток:
while (running) {
// Работа
}


Изменение флага будет видно при последующих чтениях из другого потока. Но volatile не делает составные операции атомарными:
volatile int count;
count++;


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

Atomic: когда нужна атомарная операция

В Java есть AtomicInteger, AtomicLong, AtomicBoolean, AtomicReference и другие классы:
private final AtomicInteger counter =
new AtomicInteger();

counter.incrementAndGet();


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

Типичные задачи: счётчики, последовательные номера, условное обновление флагов и ссылок. При этом несколько отдельных вызовов Atomic не становятся одной атомарной операцией автоматически.

synchronized: когда нужно защитить несколько действий

public synchronized void updateState() {
checkState();
changeState();
updateCounter();
}


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

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

Конкуренция за блокировку может приводить к ожиданию, а неправильный порядок захвата нескольких блокировок — к deadlock.

Вопрос с собеседования: достаточно ли volatile для count++? Нет. При конкурентном увеличении счётчика нужны AtomicInteger.incrementAndGet() или защита всей операции одной блокировкой.

Atomic всегда быстрее synchronized? Тоже нет. При высокой конкуренции операции на основе CAS могут многократно повторять попытки обновления. Выбор зависит от нагрузки, размера критической секции и количества связанных переменных.

Выбирайте по нужной гарантии:
→ volatile — другие потоки должны видеть изменение.
→ Atomic — нужна атомарная операция над переменной.
→ synchronized — нужно согласованно выполнить несколько действий с общим состоянием

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM