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

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Подключения к базе данных — дорогая операция.
Открывать и закрывать их на каждый запрос?
Ещё хуже.

Я нашёл простой разбор того, как на самом деле работает пул соединений и почему это важно.

Ссылка: https://sagarshiroya.dev/posts/database-connection-and-pooling

#Database #SystemDesign

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2
Совет по Java: можно избежать чрезмерного количества параметров метода, сгруппировав связанные значения в объекты. #Java #РазработкаПО

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3😁2👀2
Реальная сила Stream Gatherers в Java 24: кастомная stateful-магия с ранним завершением

Java 24 добавляет Stream Gatherers (JEP 485) — серьёзное расширение Stream API.

Они позволяют создавать кастомные промежуточные операции с поддержкой stateful-преобразований, m-to-n отображений, раннего завершения и параллельного выполнения. В отличие от коллекторов (которые терминальные), Gatherers работают прямо внутри конвейера стримов.

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

С Gatherers код на стримах остаётся ленивым, читаемым, композиционным и переиспользуемым. Теперь Stream API выглядит завершённым для реальных сценариев обработки данных.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
В Java можно использовать Optional.orElseThrow() для реализации так называемого fail-fast поведения.

✅ Fail-fast означает, что ошибки фиксируются ближе к месту возникновения, за счёт чего стек вызовов проще читать и анализировать
#Java #РазработкаПО

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3
Polling vs Long Polling vs Webhooks vs SSE

Четыре способа получать обновления от сервера. Каждый даёт свой баланс между простотой, эффективностью и «почти реалтайм» доставкой.

Вот как они отличаются:

— Polling
Клиент каждые несколько секунд отправляет запрос: «есть что-то новое?». Сервер отвечает сразу — независимо от наличия данных. Большинство ответов пустые, что тратит ресурсы клиента и сервера. Подходит для сценариев вроде статуса заказа, где допустима задержка и важна простота реализации.

— Long Polling
Клиент отправляет запрос, а сервер держит HTTP-соединение открытым до появления данных или таймаута. Пустых ответов значительно меньше, чем в обычном polling. Использовался, например, в чатах для приближения к реалтайм-доставке сообщений.

— SSE (Server-Sent Events)
Клиент открывает постоянное HTTP-соединение, сервер стримит события по мере появления. Односторонний канал, лёгкий, работает поверх обычного HTTP. Многие AI-интерфейсы стримят ответы токен за токеном именно через SSE.

— Webhooks
Вместо опроса клиентом, сервис сам отправляет HTTP POST на заранее зарегистрированный callback URL при наступлении события. Stripe использует для подтверждения платежей, GitHub — для событий push. Клиент не держит соединение и не делает запросы, просто принимает вызовы.

Часто используется комбинация: polling для простых статусов, SSE для стриминга, webhooks для событий.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3
Аккуратная идея из превью JDK 24: JEP 487, Scoped Values.

Scoped Values направлены на то, чтобы сделать общий неизменяемый контекст более предсказуемым по сравнению с ThreadLocal, особенно в современном конкурентном коде.

Небольшой пример 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java:

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

Используй готовый метод:
Collections.frequency(...)

Пример:

int count = Collections.frequency(
List.of("red", "green", "red"),
"red"
);
System.out.println(count); // 2


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🔥3
Микросервисы — это хаос без этих паттернов

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Java: если нужно писать переносы строк, соответствующие ОС, используй System.lineSeparator().


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
💡Spring Boot: задавайте границы @ComponentScan аккуратно, чтобы не сканировать целые пакеты по ошибке.

Предположим, вы используете что-то вроде @ComponentScan("com.mycompany"):

❌Увеличивается время сканирования classpath
❌Замедляется запуск приложения
❌Могут подгружаться классы, не предназначенные быть Spring-компонентами

Лучшие практики:

✅Полагаться на значения по умолчанию:

@SpringBootApplication
public class MyApplication { }


По умолчанию сканируются только подпакеты пакета, где находится MyApplication

✅Сканировать конкретные подпакеты:

@ComponentScan({
"com.mycompany.myapp.product",
"com.mycompany.myapp.order"
})


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Основные области памяти JVM:

▪️Heap (куча)
Общая для потоков
Хранит объекты и экземпляры, управляется сборщиком мусора

▪️Method Area (область методов)
Общая для потоков
Метаданные классов, статические переменные, байткод

▪️Runtime Constant Pool (пул констант времени выполнения)
На класс, разделяется
Строковые литералы, ссылки на методы, константы

▪️JVM Stack (стек JVM)
На поток
Фреймы вызовов, локальные переменные, адреса возврата

▪️Native Stack (нативный стек)
На поток
Выполнение нативного кода через JNI

▪️Program Counter (PC регистр)
На поток
Текущая инструкция, которую выполняет поток

▪️Code Cache (кэш кода)
Общий
Машинный код после JIT-компиляции

▪️Direct Memory (off-heap)
Общая
Память вне кучи для высокопроизводительного ввода-вывода

Разбиение кучи:

▪️Eden
Новые объекты создаются здесь

▪️Survivor
Краткоживущие объекты перед продвижением

▪️Old Generation
Долгоживущие объекты

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Совет по Java: избегайте глубокой вложенности if-else — используйте guard clauses (ранний выход)

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

✗ Плохо: вложенные if-else

* сложно читать
* логика размазана
* любое изменение усложняет код

✓ Хорошо: guard clauses (ранний выход)

* проверки сразу отсекают невалидные состояния
* основной сценарий читается сверху вниз
* код короче и понятнее

Почему guard clauses — профессиональный подход:

* снижают когнитивную нагрузку
* делают бизнес-логику очевидной
* упрощают рефакторинг и тестирование
* хорошо сочетаются с fail-fast подходом

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

В результате код становится:

* линейным
* предсказуемым
* удобным для поддержки

На уровне синтаксиса это мелочь, но на уровне качества кода разница существенная.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤5🤔1
Совет по Java: удаляйте неиспользуемые импорты и переменные — это улучшает читаемость кода.

До:

import java.util.Date;   // неиспользуемый импорт
import java.util.Scanner;

public class Greeting {
private int age; // неиспользуемая переменная

public void sayHello() {
Scanner sc = new Scanner(System.in);
System.out.println("Hello, world!");
sc.close();
}
}


После:

import java.util.Scanner;

public class Greeting {

public void sayHello() {
Scanner sc = new Scanner(System.in);
System.out.println("Hello, world!");
sc.close();
}
}


#Java #CleanCode

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Spring Boot: можно обрабатывать CORS глобально через WebMvcConfigurer

CORS — это механизм, который позволяет веб-приложению на одном домене (origin) получать доступ к ресурсам с другого домена.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤3
SOLID в Java: принцип подстановки Лисков (LSP) утверждает:

==> Объекты базового класса должны заменяться объектами подклассов без проблем.

× Плохой пример

* Есть класс Vehicle с методом startEngine().
* Наследуемся в Bicycle, но… у велосипеда нет двигателя, и метод выбрасывает исключение.

Такая иерархия:

class Vehicle {
public void startEngine() { ... }
}

class Bicycle extends Vehicle {
@Override
public void startEngine() {
throw new UnsupportedOperationException("Bicycles don't have engines!");
}
}


* Любой тест, который ожидает, что любой Vehicle сможет запустить двигатель, падает.
* Подкласс ведёт себя иначе, чем базовый класс — LSP нарушен.

✓ Как исправить

Разделить ответственность через интерфейсы:

interface Vehicle {}

interface Motorized {
void startEngine();
}

class Car implements Vehicle, Motorized {
public void startEngine() { ... }
}

class Bicycle implements Vehicle {
// без двигателя — всё корректно
}


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

* Подклассы не должны ломать ожидания, заданные базовым классом
* Поведение лучше разделять, чем «затыкать» методы исключениями
* LSP делает код предсказуемым и безопасным для расширения

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Кто-то выложил в опенсорс инструмент, который парсит бизнесы из Google Maps по всему миру.

Название, адрес, телефон, сайт, отзывы, часы работы — всё собирается. Достаточно ввести поисковый запрос, и он выгружает данные в CSV.

Проект на 100% с открытым исходным кодом.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
System Design Cheat Sheet — 15 ключевых концепций

1. Сбор требований

* Определить функциональные и нефункциональные требования
* Описать пользовательские сценарии и воркфлоу
* Расставить приоритеты по бизнес-целям
* Зафиксировать зависимости и ограничения

2. Архитектура системы

* Определить компоненты системы и их взаимодействие
* Выбрать подходящие архитектурные паттерны и стиль
* Оптимизировать под масштабируемость и поддерживаемость
* Оценить трейд-оффы между монолитом и распределённой системой

3. Дизайн данных

* Спроектировать модели данных, схемы и связи
* Выбрать подходящую БД под масштаб и консистентность
* Определить политики хранения, бэкапы и архивирование
* Использовать нормализацию и денормализацию по необходимости

4. Доменная модель

* Разбить систему на бизнес-домены
* Инкапсулировать функциональность внутри доменных модулей
* Минимизировать междоменные зависимости
* Обеспечить владение данными внутри доменов

5. Масштабируемость

* Реализовать горизонтальное и вертикальное масштабирование
* Использовать балансировку нагрузки
* Оптимизировать партиционирование и шардинг
* Планировать автоскейлинг под пики нагрузки

6. Надёжность

* Проектировать отказоустойчивость и деградацию
* Настроить мониторинг, алерты и логирование
* Реализовать бэкапы и восстановление
* Использовать ретраи, circuit breaker и таймауты

7. Доступность

* Реплицировать данные между узлами
* Минимизировать даунтайм через failover
* Определить планы восстановления (RTO/RPO)
* Регулярно тестировать под нагрузкой

8. Производительность

* Оптимизировать задержки и пропускную способность
* Использовать кэширование для горячих данных
* Оптимизировать алгоритмы и запросы
* Применять сжатие для передачи данных

9. Безопасность

* Реализовать аутентификацию и авторизацию
* Шифровать данные в покое и при передаче
* Проводить сканирование уязвимостей и аудиты
* Защищать API и эндпоинты от атак

10. Поддерживаемость

* Писать модульный, читаемый и документированный код
* Автоматизировать деплой и версионирование
* Проектировать систему без ломания фич при росте
* Использовать CI/CD пайплайны

11. Тестирование

* Покрывать юнит-, интеграционные и e2e-тесты
* Проводить нагрузочное тестирование
* Валидировать API и корректность данных
* Проверять безопасность и соответствие требованиям

12. Пользовательский опыт

* Делать понятный и отзывчивый интерфейс
* Оптимизировать пользовательские сценарии
* Проводить юзабилити-тестирование
* Учитывать доступность

13. Оценка стоимости

* Считать инфраструктурные затраты
* Учитывать лицензии, масштабирование и операционные расходы
* Оптимизировать использование облачных ресурсов
* Закладывать бюджет на отказоустойчивость

14. Документация

* Поддерживать актуальные техдоки и архитектуру
* Писать API-справочники и руководства
* Использовать диаграммы
* Хранить всё с версионированием

15. План миграции

* Проверить совместимость старой и новой системы
* Составить пошаговую стратегию
* Прогнать миграцию на стенде
* Проверить целостность данных после переноса

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤1
image_2026-04-28_06-49-08.png
2 MB
Spring Boot: эффективный способ обработки больших CSV-файлов — использовать возможности Spring Batch.

Spring Batch настраивается с такими опциями:

✅ Чанкинг
✅ Параллелизм
✅ Ретраи

#SpringBoot #РазработкаПО

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣4
☕️ Optional.ifPresentOrElse()

Обрабатывает случаи, когда значение в Optional есть и когда оно отсутствует, одним вызовом.

if/else для Optional → ifPresentOrElse() (JDK 9+)

🔗https://javaevolved.github.io/streams/optional-ifpresentorelse.html

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
maven-cheat-sheet.pdf
147.3 KB
Основные команды Maven для Java-разработчиков

Maven — это мощный инструмент автоматизации сборки, который используется в основном для Java-проектов. Он помогает управлять зависимостями, сборкой и жизненным циклом проекта

$ mvn archetype:generate
Создание нового Maven-проекта

$ mvn clean
Очистка директории target

$ mvn compile
Компиляция исходного кода

$ mvn test
Запуск unit-тестов

$ mvn package
Сборка проекта в JAR/WAR

$ mvn install
Установка артефакта в локальный Maven-репозиторий

$ mvn install -DskipTests
Пропустить тесты при сборке

$ mvn spring-boot:run
Запуск Spring Boot приложения (если используется spring-boot-maven-plugin)

$ mvn dependency:resolve
Обновление зависимостей

$ mvn dependency:tree
Вывод дерева зависимостей

$ mvn clean compile package
Запуск целей в указанной фазе

$ mvn validate
Проверка структуры проекта


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