Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg
Ko'proq ko'rsatish📈 Telegram kanali Java Portal | Программирование analitikasi
Java Portal | Программирование (@java_iibrary) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 11 772 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 10 272-o'rinni va Rossiya mintaqasida 54 543-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 11 772 obunachiga ega bo‘ldi.
28 Avgust, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -148 ga, so‘nggi 24 soatda esa -2 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 10.12% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 5.78% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 1 191 marta ko‘riladi; birinchi sutkada odatda 680 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 4 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent boot, string, void, архитектура, resttemplate kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 29 Avgust, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
// Пользователь ввёл: "Hello" // Пользователь ввёл: " World" // Пользователь удалил: "World" // Пользователь хочет откатить → восстановить "World" // Пользователь хочет откатить снова → восстановить "Hello"Без Memento пришлось бы вручную отслеживать каждое изменение и разрабатывать логику обратного отката для каждого действия. 🔸Проблемы без Memento - Доступ к внутренним полям - нужно лезть в приватные данные объекта для сохранения/восстановления состояния - Сложная логика отката - откат каждого типа операций приходится писать вручную - Сильная связка - логика undo перемешана с бизнес-логикой - Прожорливость памяти - хранение целых объектов вместо снапшотов 🔸Как помогает Memento Паттерн Memento говорит
> «Позволь объектам сохранять и восстанавливать своё состояние через снапшоты, не раскрывая внутренние детали».Flow 1. Создать снимок состояния 2. Сохранить в Caretaker 3. Продолжить работу 4. Запросить откат 5. Восстановить состояние 🔸Три ключевых компонента - Originator - объект, чьё состояние нужно сохранить (например, документ) - Memento - снимок состояния в определённый момент времени - Caretaker - управляет снапшотами, но не может их изменять 🔸Когда использовать Memento - Undo/Redo в редакторах, играх, формах - Транзакционный откат в базах данных или операциях - Чекпоинты в долгих процессах - История состояния для отладки или аудита 🔸Преимущества - Сохранение инкапсуляции - внутреннее состояние остаётся приватным - Чистое разделение - логика отката отделена от бизнес-логики - Гибкие снапшоты - сохраняется только то, что нужно - Простота внедрения - стандартный и понятный паттерн 🔸Примеры - Текстовые редакторы - Ctrl+Z с сохранением состояния документа - Фоторедакторы - панель истории шагов редактирования - Игры - сохранения и чекпоинты - Транзакции в БД - откат при сбое 🔸Недостатки - Память - хранение множества снапшотов - Производительность - создание снапшотов требует времени - Сложность для больших объектов - глубокое копирование может быть дорогим 👉 Java Portal
finally пишут, что он всегда выполнится, даже если в коде случилась ошибка
Пример из разряда «классика жанра»
public class FinallyExample {
public static void main(String[] args) {
try {
System.out.println("Старт");
int result = 10 / 0; // тут бахнет деление на ноль
} catch (ArithmeticException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
System.out.println("Этот блок всё равно выполнится");
}
}
}
Да, при делении на ноль выпадет исключение, но перед завершением работы всё, что внутри finally, всё равно выполнится
Но есть ситуации, когда finally не доживёт до выполнения. Например
public class FinallyExample {
public static void main(String[] args) {
try {
System.out.println("Старт");
System.exit(0); // мгновенный выход из программы
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
System.out.println("Этот блок уже не увидим");
}
}
}
Вызов System.exit() или убийство процесса извне (например, kill PID) не даст finally сработать
Теперь к более интересному
Представим, что у нас есть цепочка методов, где в конце мы хотим сделать какие-то действия в любом случае — например, зафиксировать результат в логах или отправить уведомление
Пусть методы вызывают друг друга вот так:
main → firstLogic → secondLogic → thirdLogic → fourthLogic
Пример
public static void main(String[] args) {
try {
firstLogic();
} finally {
System.out.println("FINALLY MAIN"); // логируем результат
}
}
public static void firstLogic() {
secondLogic();
}
public static void secondLogic() {
try {
thirdLogic();
} finally {
System.out.println("FINALLY SECOND"); // отправляем уведомление
}
}
public static void thirdLogic() {
fourthLogic();
}
public static void fourthLogic() {
System.out.println("D");
throw new RuntimeException();
}
В этой схеме исключение может вылететь и в thirdLogic, и в fourthLogic
Нам всё равно, где именно упало — код внутри finally, в main и secondLogic всё равно выполнится
Это удобно, когда логика сложная и методы вызывают друг друга
👉 Java Portal🔸Основы Java Ключевые концепции языка - Переменные и типы данных - Операторы и выражения - Управляющие конструкции - Массивы и коллекции - Методы и параметры - Ввод/вывод и обработка данных Объектно-ориентированное программирование - Классы и объекты - Конструкторы и методы - Полиморфизм - Абстракция - Абстрактные классы - Интерфейсы Обработка исключений - Try-Catch - Checked и Unchecked исключения - Throw и Throws - Best practices по исключениям 🔸Продвинутая Java Коллекции - List, Map (HashMap, TreeMap) - Set (HashSet, TreeSet) - Очереди и Deque - Итераторы и листераторы - Компараторы и Comparable - Кастомные коллекции Дженерики и аннотации - Обобщённые классы и методы - Wildcards (?, extends, super) - Встроенные аннотации - Кастомные аннотации - Рефлексия и обработка аннотаций Ввод/вывод и сериализация - Работа с файлами и потоками - BufferedReader/Writer - Scanner - Сериализация 🔸Многопоточность Основы потоков - Thread Class, Runnable Interface - Жизненный цикл потока - Методы потока - Демон-потоки - Thread Local Синхронизация - synchronized методы и блоки - Wait и Notify - Lock API - Producer-Consumer - Read-Write Lock Утилиты для многопоточности - Executor Framework - Callable и Future - Concurrent Collections - Atomic Variables - Semaphore и Barrier 🔸Современная Java Lambda и Streams - Лямбды - Function, Predicate, Consumer - Stream API и терминальные операции - filter, map, reduce - Optional Время и дата - LocalDate/Time, ZonedDateTime - Duration, Period - DateTimeFormatter Новые фичи - var и ключевое слово yield - Текстовые блоки - Pattern Matching - Sealed Classes - Virtual Threads 🔸Базы данных и JDBC JDBC Fundamentals - Подключение и Connection Management - Statement, PreparedStatement, ResultSet - Batch Updates Операции с БД - SQL, хранимые процедуры, функции - Индексы и оптимизация запросов Основы ORM - JPA и Hibernate - Entity Mapping и связи - HQL, JPQL - Lazy/Eager Loading 🔸Веб-разработка Java Web - Servlets и JSP (жизненный цикл, сервисы, cookies, сессии) - Spring Framework (Core, MVC, Boot, Security, AOP) - REST API, Spring Data JPA Сборка и тестирование - Maven, Gradle - JUnit, Mockito - Интеграционное тестирование - Логирование (Log4j, SLF4J) 🔸Enterprise Java - Java EE / Jakarta EE (JPA, JAX-RS, JAX-WS, JMS, JNDI, Bean Validation) - Микросервисы (Spring Cloud, API Gateway, Service Discovery, Circuit Breaker) - Message Queues (ActiveMQ, RabbitMQ, Kafka, Apache Pulsar) 🔸Производительность и инструменты JVM и производительность - JVM архитектура - Управление памятью - Garbage Collector - Профилирование (JProfiler, VisualVM) DevTools - CI/CD (Jenkins, Docker, Kubernetes) - IntelliJ IDEA, Eclipse, VS Code Мониторинг и безопасность - Health Checks - Метрики - Аутентификация (OAuth2, JWT) - OWASP рекомендации 🔸Фреймворки и библиотеки Web Frameworks - Spring Boot - Spring WebFlux - Struts 2 - JSF - Play - Micronaut - Quarkus Utility Libraries - Apache Commons - Jackson, Gson - MapStruct - Lombok Data & Caching - Redis - Elasticsearch - Ehcache - Hazelcast - Apache Ignite Specialized - Apache Camel - Netty - Akka - Vert.x👉 Java Portal
switch работал только с int, enum, String и еще несколькими примитивами. С JEP 441 теперь можно:
- использовать switch с любыми объектами
- проверять типы прямо в case
- деструктуризировать record-объекты
До этой фичи, проверить тип Object можно было с помощью instanceof и код был набором if-ов с приведением типа Object к нужному:
if (obj instanceof String) {
String s = (String) obj;
System.out.println("String length: " + s.length());
} else if (obj instanceof Integer) {
Integer i = (Integer) obj;
System.out.println("Square: " + (i * i));
}
С новой фичей проверку на тип и работа с объектом конкретного типа можно через switch:
Object obj = "abc";
switch (obj) {
case String s -> System.out.println("String length: " + s.length());
case Integer i -> System.out.println("Square: " + (i * i));
default -> System.out.println("Unknown type");
}
Чище, безопаснее и не нужно вручную кастовать типы.
👉 Java PortalFREE \b(prize|winner|URGENT)\bЛовит спам-ключевые слова. Примеры: "FREE $500!", "prize winner" 🔸Password Validator
(?=.*[A-Z])(?=.*\d).{8,}
Проверяет сложность пароля (минимум одна заглавная буква, одна цифра, длина ≥ 8).
Примеры: "MyPass123" ✓, "weak" ✗
🔸Email Field Check
^[\w.+]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
Валидирует email-адрес.
Пример: "user@gmail.com" ✓
🔸Smart Date Detection
\b\d{1,2}/\d{1,2}/\d{4}\b
Находит даты в тексте.
Пример: "Meeting on 15/8/2025"
🔸Photo Search
IMG_2025-08-.*\.jpgФильтрует фото по дате. Пример: "IMG_2025-08-15.jpg" 🔸Subtitle Timing
\d+:\d+:\d+,\d+Матчит формат таймкодов (субтитры). Пример: "00:01:23,456" 🔸Parental Controls
.*(facebook|instagram)\.com.*Блокирует URL соцсетей. Пример: "m.facebook.com" 🔸Expense Tracking
\$\d{1,3}(,\d{3})*
Извлекает суммы в валюте.
Примеры: "$1,500", "$50,000"
🔸TV Episode Filter
S[0-9]{1,2}E\d{1,2}
Матчит конкретные сезоны и эпизоды.
Примеры: "S01E05", "S03E12"
🔸E-book Chapters
^CHAPTER\s+\d+\bДелит текст книги на главы. Примеры: "CHAPTER 1", "CHAPTER 15" 🔸Phone Number (US)
^\+1\d{10}$
Проверяет формат мобильного номера (США).
Пример: "+1 9876543210"
🔸Credit Card Mask
\d{4}\s?\d{4}\s?\d{4}\s?\d{4}
Находит номера карт для маскировки.
Пример: "1234 5678 9012 3456"
🔸Log File Parsing
\[\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2}
Парсит таймстемпы логов (формат Apache/Nginx).
Пример: "[01/Aug/2025:10:30:45"
🔸URL Slug Creator
[^a-z0-9-]Удаляет не-URL символы (для генерации slug). Пример: "My Post!" → "my-post" 🔸ZIP Code (US)
^\d{5}(-\d{4})?$
Матчит почтовые индексы США.
Примеры: "12345", "12345-6789"
Паттерны из реальной жизни
🔸WhatsApp backup names
WhatsApp.*\d{4}-\d{2}-\d{2}.*\.crypt\d+
🔸YouTube video IDs
[a-zA-Z0-9_-]{11}
Например: "dQw4w9WgXcQ"
🔸Hashtag extraction
#\w+Извлекает хэштеги из текста. 🔸IPv4 addresses
\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
🔸HTML tag removal
<[^>]+>Удаляет HTML-теги из текста. 🔸Bitcoin addresses
[13][a-km-zA-HJ-NP-Z1-9]{25,34}
👉 Java PortalRUNNABLE, WAITING, TIMED WAITING )
Как снимать треддамп?
Существует несколько команд:
1) jstack
jstack <pid>
2) jcmd
jcmd <pid> Thread.print
👉 Java PortalHashMap как реализацию Map, когда нужна максимальная производительность общего назначения.
✅HashMap внутри реализован как хеш-таблица, и в среднем операции put(), get() и remove() работают за O(1).
Но, он не потокобезопасен (используйте ConcurrentHashMap, если нужна потокобезопасность).
👉 Java Portalgit init # Инициализировать репозиторий
git clone <url> # Клонировать репозиторий
git config --global user.name "Name" # Установить имя пользователя
git config --global user.email "email" # Установить email
🔸Базовые команды
git status # Проверить статус
git add <file> # Проиндексировать файл
git add . # Проиндексировать все файлы
git commit -m "msg" # Зафиксировать изменения
git commit -am "msg" # Индексация + фиксация
git log # История коммитов
git diff # Показать изменения
🔸Работа с ветками
git branch # Показать список веток
git branch -a # Показать все ветки (вкл. удалённые)
git branch <name> # Создать ветку
git checkout <branch> # Переключиться на ветку
git checkout -b <name> # Создать и переключиться на ветку
git merge <branch> # Слить ветку
git branch -d <name> # Удалить ветку
🔸Удалённые репозитории
git remote # Показать список удалённых
git remote -v # Показать URL-адреса удалённых
git push <remote> <branch> # Отправить изменения
git pull <remote> <branch> # Получить изменения
git fetch # Забрать изменения без слияния
🔸Отмена изменений
git reset <file> # Убрать файл из индекса
git reset --hard # Откат к последнему коммиту
git checkout <file> # Отменить изменения в файле
git revert <commit> # Откатить коммит (реверт)
🔸Продвинутые команды
git stash # Сохранить изменения во временное хранилище
git stash pop # Применить stash
git rebase <branch> # Перебазировать ветку
git tag <name> # Создать тег
git log --oneline # Краткий лог коммитов
👉 Java Portal@Inject
MyService(FooProcessor processor, BarLogger logger) {
this.processor = processor;
this.logger = logger;
}
В этом примере MyService — это конструктор некоего сервиса, и он помечен аннотацией @Inject. Эта аннотация сообщает DI-библиотеке, что нужно использовать именно этот конструктор для создания экземпляра сервиса.
🔸Аннотации деклараций и конструкторы
В этом посте нас не интересуют сами DI-библиотеки — важно лишь то, что аннотацию @Inject можно ставить на уровне декларации конструктора.
Если взглянуть на определение аннотации @Inject, то оно будет примерно таким:
@Target({METHOD, CONSTRUCTOR, FIELD})
@Retention(RUNTIME)
public @interface Inject {}
Здесь в @Target указано CONSTRUCTOR, что означает, что аннотацию можно применять к конструкторам. Так как @Inject применяется к декларациям, её называют аннотацией декларации
🔸Аннотации типов и конструкторы
До недавнего времени я даже не знал, что конструкторы в Java можно аннотировать также и аннотациями типов. Я много раз просматривал конструкторы, но всё равно упускал, что тип конструктора тоже может быть аннотирован.
Пример — создадим следующую аннотацию:
@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
@interface T {}
Это аннотация @T, которая применяется только к типам (TYPE_USE). Также указана политика RUNTIME, чтобы можно было получить доступ к аннотации во время выполнения.
Теперь применим её к конструктору:
static class Subject {
public @T Subject() {}
}
Код компилируется без ошибок. Обрати внимание: класс Subject — вложенный (static class), не inner, поэтому используется модификатор static.
🔸Извлечение аннотации во время выполнения
Для полноты картины — пример, как извлечь аннотацию типа с конструктора во время выполнения:
void main() throws NoSuchMethodException {
final Class<?> type = Subject.class;
final Constructor<?> constructor = type.getDeclaredConstructor();
final AnnotatedType annotatedType = constructor.getAnnotatedReturnType();
final Annotation[] typeAnnotations = annotatedType.getDeclaredAnnotations();
print("Type annotations are:", typeAnnotations);
}
private void print(String msg, Annotation[] annotations) {
System.out.println(msg);
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
}
Пошагово:
1. Получаем объект Constructor для конструктора класса Subject
2. Через getAnnotatedReturnType() получаем AnnotatedType, представляющий тип возвращаемого значения конструктора
3. Из AnnotatedType извлекаем все аннотации типа
4. Печатаем аннотации
Пример вывода:
Type annotations are: @TypeAnnotations2.T()То есть конструктор действительно аннотирован аннотацией типа
@T.
В языке программирования Java тело конструктора не должно содержать операторов return с возвращаемым значением. Однако, подобно методу, возвращающему, скажем, объект Foo, конструктор тоже возвращает значение. Результатом вызова конструктора (если он завершается без исключений) является новый экземпляр объекта, тип которого — это тип класса, в котором объявлен данный конструктор.
Таким образом, в объявлении конструктора присутствует использование типа — типа создаваемого объекта. А в Java можно аннотировать любое использование типа. Такие аннотации называются аннотациями типа
Исходный код, использованный в этом посте, можно найти в этом [Gist]
👉 Java Portal429 Too Many Requests — корректно и информативно
> Защищает инфраструктуру: один плохой пользователь не портит всё остальным.
4. Асинхронная обработка
Проблема:
Некоторые запросы тяжелые (обработка файлов, аналитика, отправка писем). Если делать их синхронно — ответ замедляется.
Решение:
- Выносить тяжёлые задачи в очередь (Kafka, RabbitMQ, SQS)
- Отвечать сразу с кодом 202 Accepted, обработку запускать в фоне
- Воркеры обрабатывают очередь и выполняют задачи
> Пользователи получают быстрый ответ, тяжёлая работа происходит «за кулисами».
5. Мониторинг и обратное давление
Проблема:
Даже при использовании балансировки, кешей и очередей, резкие всплески могут вызвать каскадные сбои.
Решение:
- Мониторить глубину очередей, задержки при доступе к БД, hit rate кеша
- Применять backpressure: замедлять запросы или отбрасывать нагрузку при приближении к лимитам
- Настроить алерты: Prometheus/Grafana, Datadog, New Relic
👉 Java Portal