Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg
Больше📈 Аналитический обзор Telegram-канала Java Portal | Программирование
Канал Java Portal | Программирование (@java_iibrary) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 11 770 подписчиков, занимая 10 256 место в категории Технологии и приложения и 54 543 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 11 770 подписчиков.
Согласно последним данным от 29 августа, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -144, а за последние 24 часа — -1, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 10.09%. В первые 24 часа после публикации контент обычно набирает 5.78% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 1 188 просмотров. В течение первых суток публикация набирает 681 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 4.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как boot, string, void, архитектура, resttemplate.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg”
Благодаря высокой частоте обновлений (последние данные получены 30 августа, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
Map.ofEntries() для создания неизменяемых мап с несколькими парами
➣ Почему: короче, безопаснее, неизменяемо — снижает риск случайной мутации.
✓ Используйте Optional.map().orElse() вместо ручной обработки null
➣ Почему: устраняет проверки на null, читается лучше, легко комбинируется с другой логикой.
✓ Используйте Enum.valueOf() + name() для безопасного преобразования enum
➣ Почему: чище и удобнее для сериализации/десериализации enum'ов в API, БД или файлах.
✓ Используйте Comparator.comparing().thenComparing() вместо кастомной логики
➣ Почему: читаемо, понятно, без ошибок в условных сравнениях.
✓ Используйте Optional.ifPresentOrElse() вместо if-else с isPresent()
➣ Почему: выразительнее и чище — больше никаких ручных get() и нагромождений if-else
👉 Java Portal{
"event_type": "like",
"actor": "UserA",
"receiver": "UserB",
"object": "Post123"
}
Шаг 2: Добавление в очередь уведомлений
➣ API валидирует данные и помещает сообщение в очередь уведомлений (Kafka/RabbitMQ)
Шаг 3: Обработка воркером
✓ Воркер извлекает сообщение из очереди:
➣ Получает полную информацию о событии
➣ Обращается к сервису предпочтений:
- Подписан ли UserB на уведомления типа "like"?
- Хочет email или только in-app?
✓ Создает payload уведомления, например:
✓ "UserA лайкнул ваш пост 'How to scale systems'"
Шаг 4: Рассылка по каналам
✓ На основе предпочтений воркер запускает соответствующие каналы:
➣ In-App Writer → сохраняет в БД (для отображения иконки колокольчика)
➣ Push-сервис → отправляет push (мобильный/веб) через FCM/APNs
➣ Email-сервис → ставит email в очередь (через SES/SendGrid)
Шаг 5: Отправка и повторные попытки
✓ Сервисы каналов:
➣ Декуплированы для изоляции отказов
➣ Повторяют попытки при сбоях (3–5 раз с экспоненциальной задержкой)
➣ Логируют статус (отправлено, ошибка, пропущено)
Шаг 6: Отображение in-app уведомлений
✓ UI вызывает /notifications?user=UserB
✓ Возвращаются N последних уведомлений из БД:
[
{ "text": "UserA лайкнул ваш пост", "read": false, ... }
]
Функции надежности
✓ Гарантированная доставка хотя бы один раз с идемпотентной записью
✓ Повторные попытки с экспоненциальной задержкой
✓ DLQ (Dead Letter Queue) для сообщений с ошибками
✓ Метрики: успех/неудача на сообщение
✓ Алерты при переполнении очереди или всплесках ошибок
👉 Java Portalintern() класса String возвращает каноническое представление строки.
Используя intern(), можно гарантировать, что одна и та же строка будет представлена в памяти в виде единственного объекта, даже если она создаётся многократно.
String s1 = "hello";
String s2 = "hello".intern();
5. Используйте паттерн Flyweight для повторяющихся неизменяемых данных
– Экономит память за счёт разделения общих экземпляров (используется, например, в Integer.valueOf(), Boolean.TRUE и т.п.).
👉 Java Portalgit merge <feature> — укажи имя исходной ветки
Результаты:
🔸Создаётся новый merge-коммит в целевой ветке с ссылками на родительские коммиты
🔸История целевой ветки становится разветвлённой, отражая все слияния
🔸Это более безопасный вариант для командной работы — история изменений сохраняется
✔️ Git Rebase
Rebase переписывает историю ветки (обычно feature-ветки), как будто коммиты были сделаны поверх другой ветки (например, main).
Получается более линейная история без merge-коммитов.
Шаги:
1. Переключись на ветку, которую хочешь ребейзнуть (например, feature)
2. Выполни git rebase <main>
Результаты:
🔸Коммиты из feature будут повторно применены на вершину main, создаются новые коммиты с теми же изменениями
🔸Целевая ветка (main) при этом не изменяется
🔸История feature-ветки становится линейной, но её история будет переписана
Примечания:
После успешного rebase, финальное merge в main часто выполняется как fast-forward, т.к. история выглядит непрерывной
Rebase изменяет ветку, на которой ты находишься, а не целевую ветку
Итог:
merge сохраняет историю как есть → хорошо для командной работы
rebase делает историю аккуратной → хорошо для чистоты, но требует осторожности
👉 Java Portalsealed и ключевое слово permits, чтобы явно указать разрешённые подклассы или реализации.
🔹Все разрешённые подтипы должны находиться в одном модуле или пакете и обязаны быть помечены как final, sealed или non-sealed
Зачем использовать sealed-классы и интерфейсы?
👉 Более строгая инкапсуляция и контроль над публичным API
👉 Безопасный и предсказуемый код (отлично подходит для pattern matching в switch)
👉 Защита от нежелательного наследования или реализации
👉 Java Portal/api
• Для каждого пользователя создаётся бакет с лимитом 5 запросов в минуту. Если бакет позволяет — запрос проходит. Если нет — возвращается 429 статус.
• Заглушка для HttpServletResponse, нужна чтобы код можно было запускать без настоящего HTTP-сервера.
👉 Java PortalМеня зовут Тихон, привет! Я — действующий Frontend-разработчик и ментор. Помогаю устроиться на хорошие позиции в Bigtech и сопровождаю на испытательном сроке.В своем канале: 👉 публикую видео с решением задач, которые прямо сейчас дают крупные компании на собеседованиях 👉даю примеры по прохождению собеседований 👉разбираю резюме и докручиваю резюме подписчиков 👉и просто создаю дружелюбное, комфортное сообщество, где коллеги всегда готовы подсказать и поддержать 🎁В закрепе тебя ждёт подборка из 60 задач, которые сейчас дают на собеседованиях Яндекс, Т-Банк и другие крупные IT игроки. Подписывайся и получай максимум пользы, а нас уже больше 2000 🤓: https://t.me/+p0ldgDr3Wp5iMWY6 Реклама, ИП Галактионов Тихон Витальевич, инн: 771618975809, erid: 2W5zFK1XXg4
setDaemon(true) до запуска потока
🔹Запускаете поток через start()
Как только основной (пользовательский) поток завершится — JVM выключится, даже если daemon-поток всё ещё активен.
Используйте daemon-потоки для фоновых сервисов, которые не должны блокировать завершение приложения. Всегда вызывайте setDaemon(true) до запуска
👉 Java Portalenum Status { PENDING, APPROVED, REJECTED } → Базовый Enum
• Это называется enum (сокращение от enumeration).
• Используется для задания фиксированного набора констант (например, состояния заказа, роли пользователя).
2. Status.valueOf("APPROVED") → Преобразование строки в Enum
• Бросает исключение, если строка некорректна.
• Используется при маппинге из БД, пользовательского ввода или JSON (например, парсинг статуса из запроса).
3. Status.APPROVED.name() → Получить имя как строку
• Возвращает имя enum-константы в точности как оно определено.
• Используется при логировании, сериализации и т. д. (например, отображение enum как строки в ответе).
4. Status.APPROVED.ordinal() → Получить индекс Enum
• Возвращает позицию (начиная с 0).
• Используется только если порядок важен (обычно избегается ради стабильности) — например, для ранжирования уровней.
5. for (Status s : Status.values()) → Перебор значений Enum
• Используется для итерации по всем константам.
• Удобно для UI-дропдаунов, фильтров, пакетной обработки.
6. enum Day { MON, TUE; boolean isWeekend() { return false; } } → Enum с методами
• Добавляет поведение к enum.
• Используется, если для каждой константы нужна логика (например, isHoliday() для Day).
7. enum Type { BASIC("B"), PREMIUM("P"); private String code; ... } → Enum с полями
• Используется для хранения дополнительных данных с каждой константой (например, код из БД, описание).
8. Enum с абстрактным методом
enum Mode {
ON { void act() { /* что-то делаем */ } },
OFF { void act() { /* ничего не делаем */ } };
abstract void act();
}
• Называется поведенческим enum'ом.
• Используется для логики, подобной конечному автомату (например, стратегии на константу).
9. EnumSet.of(Status.APPROVED) → EnumSet
• Высокопроизводительное множество для enum.
• Используйте вместо HashSet<Enum> (например, для фильтрации флагов или ролей).
10. EnumMap<Status, String> → EnumMap
• Эффективная key-value структура, использующая enum в качестве ключа.
• Быстрее и легче, чем HashMap<Enum, X> (например, для меток или конфигураций по статусу).
11. switch(status) → Enum в операторе switch
• Работает с enum'ами нативно.
• Используется для route-логики (например, обработки каждого статуса по-своему).
👉 Java PortalReadWriteLock — это утилита для работы с параллелизмом в Java, которая позволяет нескольким потокам одновременно читать ресурс, но только одному потоку — записывать, и только в том случае, если никакие другие потоки в данный момент не читают и не пишут.
Этот механизм значительно повышает пропускную способность в приложениях с преобладанием операций чтения по сравнению с использованием обычного взаимного исключения (например, synchronized или ReentrantLock), где доступ к ресурсу может получить только один поток за раз.
Как работает ReadWriteLock
🔹Read Lock (блокировка на чтение):
Несколько потоков могут одновременно получить блокировку на чтение, если ни один поток не владеет блокировкой на запись и ни один поток не ожидает записи. Это позволяет выполнять параллельные операции чтения, что эффективно для ресурсов, к которым часто обращаются на чтение и редко — на запись.
🔹Write Lock (блокировка на запись):
Только один поток может получить блокировку на запись, и только если в данный момент нет активных читателей и писателей. Это обеспечивает исключительный доступ при модификации данных, предотвращая неконсистентность.
Java предоставляет стандартную реализацию интерфейса ReadWriteLock в виде класса ReentrantReadWriteLock.
Пример применения
Допустим, у вас есть общая структура данных, например, кэш или список, к которым обращаются несколько потоков:
🔹Читатели: множество потоков часто читают данные.
🔹Писатели: время от времени поток обновляет данные.
Используя ReadWriteLock, вы позволяете всем читателям одновременно обращаться к данным, но гарантируете, что при обновлении данных писатель будет иметь исключительный доступ. Это повышает производительность и обеспечивает потокобезопасность.
👉 Java Portal