Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg
Show more📈 Analytical overview of Telegram channel Java Portal | Программирование
Channel Java Portal | Программирование (@java_iibrary) in the Russian language segment is an active participant. Currently, the community unites 12 115 subscribers, ranking 10 397 in the Technologies & Applications category and 54 492 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 12 115 subscribers.
According to the latest data from 08 June, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -138 over the last 30 days and by -5 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 11.21%. Within the first 24 hours after publication, content typically collects 6.34% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 360 views. Within the first day, a publication typically gains 769 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 4.
- Thematic interests: Content is focused on key topics such as boot, string, void, архитектура, resttemplate.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg”
Thanks to the high frequency of updates (latest data received on 09 June, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
@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 Portalsynchronized, wait, notify и join
Примеры использования:
🔸Ограничить количество одновременных действий
🔸Дождаться завершения нескольких потоков
🔸Запустить все потоки одновременно
🔸Обменяться данными между потоками
👉 Java Portal➖ Инструменты моделирования: • Enterprise Architect • Archi • Structurizr • Carbide • StarUML • Aplas • GenMyModel • Gaphor • Archipeg • Astah • Mood ➖ Code-based инструменты • PlantUML • Structurizr • Ilograph • Graphviz • Mermaid • Diagrams ➖ Автоматизированные инструменты: • Brainboard • Hyperglance • Hava • Archium ➖ Инструменты для создания диаграмм: • Visio • Lucidchart • [Draw.io](http://draw.io) • Cloudcraft • isoflow • Visual Paradigm • Cacoo • Cloudviz • Excalidraw • CloudSkew • Figma • Whimsical • Miro • Mural • SketchПолный список: softwarearchitecture.tools 👉 Java Portal
.thenApply(), .handle() и всей этой цепочки с CompletableFuture?
Загляни в ea-async от Electronic Arts
ea-async — это библиотека, которая позволяет писать асинхронный код в стиле обычного синхронного Java-кода, используя await() прямо как в JavaScript/TypeScript.
Под капотом — bytecode instrumentation и CompletableFuture
👉 Java PortalStream API и .parallel() вместо явных ExecutorService, Future, invokeAll и ручной обработки InterruptedException
Однако такой подход использует common ForkJoinPool, и его поведение не всегда предсказуемо, результаты могут отличаться между запусками, особенно при исключениях в задачах
(callsCounter может сильно варьироваться)
Если в процессе одна из задач выбрасывает Exception, выполнение остальных может продолжаться
даже после возврата ошибки.
Параллельные стримы группируют задачи по частям коллекции, и минимальной единицей
может быть блок из нескольких элементов, это может привести к «неравномерной» нагрузке и даже ухудшению производительности по сравнению с ручным управлением через ExecutorService.
Блокирующие операции внутри задач могут полностью "забить" common ForkJoinPool, что повлияет и на выполнение CompletableFuture.thenApplyAsync(), если вы не указали свой Executor
Читать подробнее<...>
👉 Java PortalModuleLayer:
// /tmp/ModuleLoad.java
void main() throws Exception {
Path h2 = Path.of("/tmp/h2-2.3.232.jar");
ModuleFinder before = ModuleFinder.of(h2);
ModuleFinder after = ModuleFinder.of();
Set<String> roots = Set.of("com.h2database");
ModuleLayer parentLayer = ModuleLayer.boot();
Configuration parentConf = parentLayer.configuration();
Configuration conf = parentConf.resolve(before, after, roots);
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer layer = parentLayer.defineModulesWithOneLoader(conf, scl);
ClassLoader cl = layer.findLoader("com.h2database");
Class<?> c = cl.loadClass("org.h2.tools.Shell");
Method main = c.getMethod("main", String[].class);
Object args = new String[0];
main.invoke(null, args);
}
Один из возможных кейсов — реализация плагин-системы в приложении.
Другой кейс — запуск всего приложения через начальный загрузчик, выполняя:
java Way.java
Иными словами, файл Way.java выступает в роли скрипта, который:
🔸Загружает все необходимые JAR-файлы приложения.
🔸Загружает основной модуль приложения и запускает само приложение.
Это базовая идея, лежащая в основе Objectos Start.
👉 Java Portalmain или develop).
Подходит для команд, где важен строгий код-ревью и фичи разрабатываются изолированно.
2. Gitflow
Модель ветвления с чётким процессом управления релизами. Используются ветки develop, release, hotfix, feature — каждая со своей ролью в процессе разработки.
Лучше всего подходит для крупных проектов с запланированными циклами релизов.
3. GitLab Flow
Комбинирует идеи Feature Branching и Gitflow, но делает их проще. С акцентом на деплой и интеграцию с issue-трекингом и CI/CD.
Стратегия включает основную ветку (main), которая отражает продакшен-код, и при необходимости — отдельные ветки под окружения (например, staging, production и т.д.).
Подходит для команд, использующих GitLab и практики непрерывной поставки (CD).
4. GitHub Flow
Лёгкий и понятный процесс на основе веток, отлично подходит под continuous deployment. Ветка main всегда должна быть в деплойном состоянии. Фичи разрабатываются в отдельных ветках от main, изменения проходят через pull request.
Хороший выбор для небольших команд и проектов с постоянными поставками.
5. Trunk-Based Development
Все разработчики коммитят напрямую в основную ветку (trunk). Фичевые ветки либо очень короткоживущие, либо не используются вовсе.
Подходит для команд, практикующих CI/CD, и проектов, где приоритет — скорость разработки.
Если ты только начинаешь работать с Git — начни с простой стратегии вроде GitHub Flow и эволюционируй по мере роста команды и сложности проекта.
Для больших команд или сложных процессов лучше использовать более структурированные подходы, такие как Gitflow или GitLab Flow.
Независимо от выбранной стратегии ветвления, важно:
- Настроить автоматическое тестирование, чтобы быстрее ловить баги.
- Согласовать стандарты по commit-сообщениям, нейминг веток и процессам слияния.
👉 Java Portalnew. Управляется сборщиком мусора (Garbage Collector), работает медленнее, но даёт больше гибкости.
➡️Объекты всегда размещаются в куче (heap).
➡️Ссылки на эти объекты (например, локальные переменные) хранятся в стеке (stack).
➡️Неправильное управление созданием объектов или удержание ссылок дольше, чем нужно, может привести к утечкам памяти (memory leaks).
public class MemoryDemo {
public static void main(String[] args) {
int x = 10; // Хранится в стеке
Person p = new Person("Alice"); // 'p' находится в стеке, объект — в куче
p.sayHello(); // Вызов метода создаёт новый стек-фрейм
}
}
class Person {
String name; // Поле хранится в куче вместе с объектом
Person(String name) {
this.name = name;
}
void sayHello() {
System.out.println("Hello, " + name);
}
}
👉 Java Portalgit init my-new-project
2. git branch — Создать локальную ветку.
🔸Пример: git branch feature/login
3. git checkout — Переключиться на другую ветку.
🔸Пример: git checkout feature/login
4. git add — Добавить файлы в индекс (staging area) для коммита.
🔸Пример: git add file.js
5. git commit — Зафиксировать добавленные изменения.
🔸Пример: git commit -m "Fix navigation bug"
6. git pull — Обновить локальную ветку с удалённого репозитория.
🔸Пример: git pull origin main
7. git push — Отправить локальные коммиты в удалённый репозиторий.
🔸Пример: git push origin main
8. git status — Показать состояние файлов (изменённые, добавленные, удалённые и т.д.).
🔸Пример: git status
9. git diff — Показать разницу между версиями.
🔸Пример: git diff HEAD~1 HEAD
10. git log — Посмотреть историю коммитов.
🔸 Пример: git log --oneline --graph
11. git clone — Скопировать удалённый репозиторий локально.
🔸 Пример: git clone https://github.com/user/repo.git
12. git merge — Объединить ветки.
🔸Пример: git merge feature/login
13. git rebase — Перенести коммиты на другую базу (ветку).
🔸Пример: git rebase main
14. git stash — Временно сохранить изменения, не готовые к коммиту.
🔸Пример: git stash push -m "WIP login"
15. git fetch — Скачивать объекты из удалённого репозитория без слияния.
🔸Пример: git fetch origin
16. git reset — Переместить HEAD или убрать файлы из индекса.
🔸Пример: git reset --hard HEAD~1
17. git revert — Создать новый коммит, отменяющий предыдущие изменения.
🔸Пример: git revert 1a2b3c4
18. git cherry-pick — Применить конкретный коммит на текущую ветку.
🔸Пример: git cherry-pick 1a2b3c4
19. git remote — Управление удалёнными репозиториями.
🔸Пример: git remote add origin git@github.com:user/repo.git
20. git tag — Пометить контрольные точки релизов.
🔸Пример: git tag -a v1.0 -m "Initial release"
👉 Java Portaljava.nio.file)
🔸Мощное и современное API для работы с файлами и директориями.
3. java.time (Date and Time API)
🔸Новая система работы с датой и временем (введена в Java 8) — безопаснее и удобнее, чем Date/Calendar.
4. JUnit 5
Фреймворк для модульного тестирования с расширенными возможностями и гибкой архитектурой.
5. java.util.concurrent (Concurrency API)
🔸API для реализации многопоточности, синхронизации и конкурентных структур данных.
6. java.net.http (HTTP Client API)
🔸Стандартный HTTP-клиент для отправки запросов и получения ответов (введён в Java 11).
7. Process API (java.lang.ProcessHandle)
🔸Позволяет управлять и отслеживать системные процессы: получать PID, статус, время запуска и пр.
👉 Java Portalfinalize() в Java — он вызывается только один раз перед удалением объекта сборщиком мусора. В первой попытке объект «воскрешается» внутри finalize, но при повторной попытке finalize уже не вызывается, и объект действительно удаляется.
👉 Java Portal
Available now! Telegram Research 2025 — the year's key insights 
