Java | Фишки и трюки
Kanalga Telegram’da o‘tish
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna
Ko'proq ko'rsatish6 954
Obunachilar
-724 soatlar
+117 kunlar
+830 kunlar
Postlar arxiv
6 954
☕️Наследование в классах
В этом видео автор подробно объясняет концепцию наследования в Java: как один класс может наследовать свойства и методы другого, когда применять `extends`, как переопределять методы и использовать ключевое слово `super`.🗣️Запомни: наследование — мощный механизм для повторного использования кода и организации иерархий классов. 🤩 Java Фишки и трюки || #Видео
6 954
🤝 «Контракты не лгут: как сервисы общаются без боли»
Contract Testing в Java — контроль реальности между продами
Когда микросервисы множатся, интеграционные тесты превращаются в хаос.
Сервис А ждёт одно, сервис B отдаёт другое — и привет, баг в проде.
Contract Testing решает это через договор: что именно API обещает и возвращает.
📄 Суть контракта
Потребитель (Consumer) описывает, что он ждёт от поставщика (Provider). Provider подтверждает: «Да, я действительно так отвечаю».➡️ Это проверка не по коду, а по взаимному соглашению. ⚙️ Pact — главный игрок в Java Pact позволяет Consumer’у описывать ожидаемые запросы и ответы:
@Pact(consumer = "OrderService")
public RequestResponsePact createPact(PactDslWithProvider builder) {
return builder
.given("User exists")
.uponReceiving("a request for user details")
.path("/users/123")
.method("GET")
.willRespondWith()
.status(200)
.body("{\"id\":123,\"name\":\"Alex\"}")
.toPact();
}
➡️ Это «контракт»: JSON с ожиданиями клиента.
🧪 Consumer Test — проверка ожиданий
@ExtendWith(PactConsumerTestExt.class)
@PactTestFor(providerName = "UserService", port = "8080")
public void testUserService(MockServer server) {
Response response = get(server.getUrl() + "/users/123");
assertEquals(200, response.getStatusCode());
}
➡️ Тест проверяет, что клиент правильно формирует запрос и обрабатывает ответ.
🏭 Provider Test — подтверждение контракта
Поставщик поднимает mock и проверяет:
«Я реально возвращаю то, что обещал в контракте».
@Provider("UserService")
@PactFolder("pacts")
class UserServicePactTest {
@TestTarget
final Target target = new HttpTarget(8080);
@State("User exists")
public void userExists() {
// фикстуры для теста
}
}
➡️ Если что-то не совпадает — билд падает.
🔗 Pact Broker — центр доверия
Все контракты хранятся в брокере.
Каждый сервис знает, с кем и что согласовано.
docker run -d -p 9292:9292 pactfoundation/pact-broker
➡️ Это реестр соглашений между микросервисами.
🧩 Contract Testing ≠ интеграция
Интеграционные тесты требуют запущенные сервисы. Контрактные тесты — только спецификации.➡️ Меньше зависимостей, быстрее CI, больше стабильности. 🚀 Spring Cloud Contract — альтернатива Pact Работает прямо в Spring Boot.
contract {
request {
method 'GET'
url '/users/123'
}
response {
status 200
body(id: 123, name: "Alex")
}
}
➡️ Контракт → автогенерированный тест для Provider’а.
➕ Плюсы:
➕ Нет неожиданностей при релизах. ➕ CI ломается до продакшена, если кто-то нарушил контракт. ➕ Каждый сервис тестируется изолированно.➖Минусы:minu
➖Нужно поддерживать актуальность контрактов. ➖При множестве сервисов — много файлов. ➖Не ловит ошибки логики (только интерфейсов).🗣 Запомни: Contract Testing — это «юридическая проверка» между сервисами.
6 954
🔍Тестовое собеседование с Java-разработчиком из Мегафон уже завтра
15 октября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Мария Пивоварова, старший разработчик в Мегафон, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Мария будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Марии
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
6 954
🛰 «Смотри глубже: Observability в действии»
Мониторинг, трассировка и метрики, которые спасают прод
Observability — это не просто графики и алерты. Это способ понять, что реально происходит внутри системы.
В отличие от обычного мониторинга, observability показывает почему всё пошло не так.
Разберём, как инженеры держат прод под контролем 👇
📡 Metrics — сердце наблюдаемости
Prometheus + Grafana — золотой стандарт.
# prometheus.yml
scrape_configs:
- job_name: 'app'
static_configs:
- targets: ['app:8080']
➡️ Метрики — это числа: latency, CPU, RPS, ошибки.
Grafana визуализирует, Prometheus хранит и алертит.
🧭 Logs — что реально произошло
Elastic Stack или Loki от Grafana.
docker run -d -p 9200:9200 elasticsearch
docker run -d -p 5601:5601 kibana
➡️ Логи нужны, когда метрика показала «плохо».
Хочешь знать, почему? Иди в логи.
🚦 Traces — кто виноват в задержках
OpenTelemetry + Jaeger показывают путь запроса через микросервисы.
from opentelemetry import trace
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("db_query"):
query_database()
➡️ Trace — это маршрут.
С его помощью видно, где реально теряется время.
🧩 OpenTelemetry — единый язык наблюдаемости
Собирает метрики, логи и трассировки из любого кода.
pip install opentelemetry-sdk opentelemetry-exporter-otlp
➡️ Универсальный стандарт. Работает и с Python, и с Java, и с Go.
💡 Alerting — чтобы не узнавать о сбоях из Telegram
Prometheus + Alertmanager → уведомления при SLA-фейле.
- alert: HighErrorRate
expr: rate(http_requests_total{status="500"}[5m]) > 0.05
for: 2m
labels:
severity: critical
➡️ Хороший alert не просто орёт. Он помогает понять причину.
🧱 Distributed Context — связать всё вместе
Код → метрики → логи → трассы — одно пространство событий. Zipkin, Tempo, Jaeger — строят полную цепочку от запроса до ответа.➡️ Это основа SRE-практик: найти проблему за минуты, а не часы. 🔍 Instrumentation — чтобы код умел говорить
Библиотеки сами шлют метрики: Spring Boot Actuator, FastAPI middleware, Django signals.➡️ Observability — не внешний тул, а часть приложения. ⚙️ Cloud-native observability
AWS CloudWatch, GCP Operations Suite, Datadog, New Relic. Для Kubernetes — Lens, K9s, Grafana Tempo.➡️ Современные пайплайны включают observability как часть CI/CD. 🗣 Запомни: Observability ≠ просто мониторинг — это понимание поведения системы.
6 954
Карьерный буст, робот в подарок и призовой фонд 7 500 000 рублей 🤖
Успей зарегистрироваться до 20 октября.
Все это ждет участников трека «Программирование роботов» на всероссийском ИТ-чемпионате МТС True Tech Champ 2025. Присоединяйся, если пишешь на С++, Go, Python, JS, Java, C# или другом языке.
Соревнования пройдут в командах от 2 до 4 человек в несколько этапов:
— Квалификация. Тебе предстоит запрограммировать робота на прохождение виртуального лабиринта.
— Полуфинал. Ты будешь дистанционно управлять роботом на офлайн-полигоне и наблюдать за его перемещениями в трансляции.
— Финал. За две недели до финала организаторы отправят тебе настоящего робота для кастомизации. Ты сможешь модифицировать его, чтобы он оказался быстрее других в многоуровневом офлайн-лабиринте и смог выбить соперников с платформы в шоу-битве.
Команды финалистов получат по одному роботу Waveshare Cobra Flex в подарок и сразятся за крупные денежные призы: 4 000 000 ₽ за первое место, 2 500 000 ₽ за второе и 1 000 000 ₽ за третье.
Еще ты сможешь:
— Получить практический опыт работы с инструментами, с помощью которых создают домашних и промышленных роботов.
— Прокачать компетенции, которые помогут развиваться в ИТ.
— Заявить о себе на всю Россию и ускорить свой профессиональный рост.
📍 Финал состоится 21 ноября в МТС Live Холл в Москве.
👉🏻 Регистрируйся на сайте до 20 октября.
6 954
🔥 «Когда поток — это архитектура»
Kafka Streams и ksqlDB + Java: живые системы на событиях
Сервисы больше не должны “ждать запрос”. Современные системы реагируют на события — в реальном времени. Kafka Streams и ksqlDB превращают поток данных в ядро приложения, а не просто транспорт сообщений.
⚡️ 1. Архитектура event-driven
Kafka — это не просто очередь. Это commit-log всех событий в компании:
🟠пользователь оплатил заказ, 🟠склад обновил остатки, 🟠ML-модель прислала прогноз.➡️Java-сервис подписывается на эти события и сам становится реактивным узлом. 🧩 2. Kafka Streams — логика прямо в потоке Пример: считаем количество заказов в минуту по пользователю 👇
StreamsBuilder builder = new StreamsBuilder();
KStream<String, String> orders = builder.stream("orders");
orders.groupByKey()
.windowedBy(TimeWindows.of(Duration.ofMinutes(1)))
.count()
.toStream()
.to("orders_per_minute");
KafkaStreams streams = new KafkaStreams(builder.build(), props);
streams.start();
➡️ Данные не хранятся — они *текут*. Поток сам агрегирует и публикует результат в новый топик.
📊 3. KTable и состояние
Kafka Streams позволяет хранить состояние между событиями:
KTable<String, Long> orderCounts = orders
.groupByKey()
.count(Materialized.as("orders-store"));
➡️ KTable — как материализованная view в БД, но в оперативной памяти и постоянно обновляется.
🧠 4. ksqlDB — SQL для стримов
Если не хочется писать Java-код, можно просто запросить поток SQL-ом:
CREATE STREAM orders_stream (user_id VARCHAR, price DOUBLE)
WITH (KAFKA_TOPIC='orders', VALUE_FORMAT='JSON');
CREATE TABLE user_revenue AS
SELECT user_id, SUM(price) AS total
FROM orders_stream
WINDOW TUMBLING (SIZE 1 HOUR)
GROUP BY user_id;
➡️ Результат — новый поток данных. Kafka сама всё поддерживает в актуальном состоянии.
🔄 5. Реактивные микросервисы
Сервисы больше не ходят в БД, чтобы “узнать новое”.
Kafka — это их канал событий.
@KafkaListener(topics = "user_revenue")
public void handleRevenue(String msg) {
System.out.println("💰 " + msg);
}
➡️ Микросервисы реагируют на новые сообщения, а не крутят cron.
🧰 6. Пример конвейера событий
[orders] → [Kafka Streams: агрегация] → [ksqlDB: фильтрация] → [billing-service]➡️ Каждый шаг — отдельная логика. Данные текут без REST-запросов. 🔗 7. Масштабирование и отказоустойчивость
Kafka Streams хранит state в RocksDB и реплицирует его между инстансами. Перезапуск — и поток сам продолжает с последнего offset.➡️ Никакой ручной синхронизации или блокировок. ⚙️ 8. Интеграция с экосистемой Spring
@EnableKafkaStreams
@Configuration
public class StreamConfig {
@Bean
public KStream<String, String> kStream(StreamsBuilder builder) {
return builder.stream("orders");
}
}
➡️ Spring Boot 3 поддерживает Kafka Streams из коробки — никаких костылей.
🚀 9. Kafka как data backbone
Kafka связывает микросервисы, ML, ETL и аналитические пайплайны. Хранилище, транспорт и очередь — всё в одном.🧩 10. Когда ksqlDB против Streams
| Сценарий | Что выбрать | | ----------------------------- | ---------------- | | Быстрый прототип, SQL-запросы | ksqlDB | | Сложная логика, типизация | Kafka Streams | | Обработка JSON и Avro | оба поддерживают | | Глубокая интеграция с Java | Streams |🗣️ Запомни:Event-driven — не мода, а способ думать в реальном времени. Kafka Streams — это код, который живёт в потоке данных.
6 954
День открытых дверей онлайн-программы «Frontend-разработчик»
Центр непрерывного образования ФКН НИУ ВШЭ открывает набор на обучение фронтенд-разработке. Слушатели познакомятся с HTML, CSS, JavaScript, TypeScript, React.js. Программа включает создание адаптивных пользовательских интерфейсов, работу с одностраничными приложениями (SPA) и реализацию итоговых проектов.
Узнать подробнее о онлайн-курсе по фронтенду вы сможете на Дне открытых дверей:
🟣как устроена веб-разработка
🟣кто такие фронтенд-разработчики и чем они занимаются
🟣что умеет делать фронтендер и почему карьера в разработке является интересной и перспективной
🟣какие знания вы приобретете на курсе и какие навыки сформируете в процессе обучения
🟣как получить максимальную пользу от занятий на курсе
Спикеры:
🎙Андрей Сухов, старший эксперт по технологиям в Сбере и преподаватель онлайн-курса «Frontend-разработчик» Центра непрерывного образования ФКН.
🎙Таисия Ахматова, менеджер по работе со слушателями и организации учебного процесса Центра непрерывного образования ФКН.
Когда: 8 октября в 18:30.
Регистрация 📍
Реклама. НИУ "ВШЭ". ИНН 7714030726. erid: 2SDnjdk7EEb
6 954
🧩 Java без JNI: как FFM API ломает старые правила
Раньше, чтобы вызвать C-код из Java, приходилось страдать с JNI — заголовки,
javah, System.loadLibrary(), краши и боль.Теперь всё проще: Foreign Function & Memory API (FFM) — новый стандарт для прямого доступа к нативным функциям и памяти.
⚙️ Импорт C-функций напрямую
FFM API позволяет вызывать функции из libc без JNI.
import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;
try (Arena arena = Arena.openConfined()) {
Linker linker = Linker.nativeLinker();
SymbolLookup libc = linker.defaultLookup();
MethodHandle printf = linker.downcallHandle(
libc.find("printf").get(),
FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS)
);
MemorySegment msg = arena.allocateUtf8String("Hello from C!\n");
printf.invoke(msg);
}
➡️ Всё чисто на Java: без генерации C-кода, без jni.h, с полным контролем памяти.
🧠 Работа с нативной памятью
try (Arena arena = Arena.openConfined()) {
MemorySegment segment = arena.allocate(4);
segment.set(ValueLayout.JAVA_INT, 0, 1337);
System.out.println(segment.get(ValueLayout.JAVA_INT, 0));
}
➡️ Создаёшь участок памяти, читаешь и пишешь — без Unsafe и без GC-хаоса.
🧬 Interop с существующими C-библиотеками
Хочешь вызвать strlen или qsort? Пожалуйста.
MethodHandle strlen = linker.downcallHandle(
libc.find("strlen").get(),
FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS)
);
long len = (long) strlen.invoke(arena.allocateUtf8String("PyLinux"));
System.out.println(len);
➡️ Вызываешь функции C напрямую, как будто они твои.
🧰 Безопасность и контроль
FFM API чётко ограничивает область памяти (через Arena), предотвращая утечки и use-after-free. Можно использовать “scoped memory” — живёт ровно столько, сколько нужно.🚀 Производительность
JNI требует перехода между Java и C стэками → дорого. FFM API компилируется JIT’ом и оптимизируется HotSpot → почти нативная скорость.🔬 Статический биндинг с jextract
jextract генерирует Java-обёртки по .h-файлам.
jextract -t com.libc /usr/include/stdio.h
➡️ Автоматически создаёт Java-интерфейсы для вызова C-функций — без ручного JNI.
🧱 Будущее без JNI
С FFM API Java получает настоящий доступ к низкоуровневому миру:
🟢 без C-кода, 🟢 без падений JVM, 🟢 без плясок с System.load().🗣️ Запомни:FFM API — это чистый Java-интерфейс к нативному миру. JNI уходит в прошлое. Скорость и контроль — без риска.
6 954
В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн
Но где их находить? Как узнавать о них раньше, чем когда все начнут выкладывать фотографии оттуда?
Переходите на канал IT-Мероприятия России. В нём каждый день анонсируются мероприятия со всех городов России
📆 в канале размещаются как онлайн, так и оффлайн мероприятия;
👩💻 можно найти ивенты по любому стеку: программирование, frontend-backend разработка, кибербезопасность, дата-аналитика, osint, devops и другие;
🎙 разнообразные форматы мероприятий: митапы с коллегами по цеху, конференции и вебинары с известными опытными специалистами, форумы и олимпиады от важных представителей индустрии и многое другое
А чтобы не искать по разным форумам и чатам новости о предстоящих ивентах:
🚀 IT-мероприятия России — подписывайся и будь в курсе всех предстоящих мероприятий!
6 954
⚡️ Scoped Values в Java — альтернатива ThreadLocal для виртуальных потоков
С появлением виртуальных потоков (
Project Loom) старый ThreadLocal стал проблемой. Он держит данные на весь поток, что для миллионов lightweight-тредов дорого. Решение — ScopedValue.
📦 Объявление значения
import java.lang.ScopedValue;
public class Demo {
static final ScopedValue<String> USER = ScopedValue.newInstance();
}
➡️ Создаём "контейнер" для данных, которые будут жить только в заданной области.
🧩 Передача значения в scope
ScopedValue.where(USER, "Alice").run(() -> {
System.out.println("Hello, " + USER.get());
});
➡️ Значение доступно только внутри run(). Вышел из scope — данных нет.
⚡️ Виртуальные потоки + ScopedValue
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() ->
ScopedValue.where(USER, "Bob").run(() -> {
System.out.println("User in virtual thread: " + USER.get());
})
);
}
➡️ Локальные данные для каждого виртуального потока без утечек.
🔍 Сравнение с ThreadLocal
ThreadLocal<String> local = new ThreadLocal<>();
local.set("Alice");
➡️ Удобно, но значение живёт, пока жив поток. Виртуальные потоки → миллионы копий → утечки памяти.
🛡ScopedValue — иммутабельность
ScopedValue.where(USER, "Charlie").run(() -> {
// USER.set("Dave"); ❌ нельзя
System.out.println(USER.get());
});
➡️ Нельзя изменить внутри scope. Значение задаётся один раз, это делает код безопаснее.
🧠 Наследование scope
ScopedValue.where(USER, "Admin").run(() -> {
new Thread(() -> System.out.println(USER.get())).start();
});
➡️ Новый поток не видит значение. Данные строго локальны. Нет "магического" наследования, как у InheritableThreadLocal.
📊 Где применять
🟢 Контекст запроса (user id, trace id). 🟢 Логирование. 🟢 Передача настроек без проброса аргументов.❌ Минусы ScopedValue
🔴 Только read-only. 🔴 Живёт только в рамках scope. 🔴 Работает начиная с Java 20+.🗣 Запомни: ThreadLocal опасен для виртуальных потоков — утечки и лишняя память. ScopedValue проще: задаёшь значение в scope, читаешь только там. Без наследования, без мутабельности, идеально для миллионов lightweight-тредов.
6 954
⚡️Группа хакеров взломала сервера Skillbox, Geekbrains, Skillfactory и ещё 12 онлайн-школ, чтобы выгрузить их курсы в Telegram
Юристы пытаются удалить каналы за Авторские Права🤡 – потому вот актуальные ссылки на архивы:
По школам:
├ Skillbox (1.12 ТБ)
├ Нетология (846 ГБ)
├ SkillFactory (720 ГБ)
├ GeekBrains (934 ГБ)
└ Другие (3.21 ТБ)
По ЯП:
├ Python (1.48 ТБ)
├ SQL (982 ГБ)
├ С++ (590 ГБ)
├ C (318 ГБ)
├ GoLang (290 ГБ)
└ Другие (3.17 ТБ)
Ссылка на общий архив: @schools_hack_arc
6 954
⌨️ Что такое текстовые блоки (Text Blocks)?
Text Blocks (
""") позволяют удобно работать с многострочными строками без необходимости экранировать кавычки.
• Улучшают читаемость кода.
• Поддерживают форматирование и перенос строк.
• Упрощают работу с JSON, SQL и HTML.
✔️ Пример:
String json = """
{
"name": "Alice",
"age": 30
}
""";
System.out.println(json);
💡 Совет: Используйте Text Blocks для удобного написания больших строковых данных.
#java #textblocks #java156 954
Зарплата 207.000р у Middle-разработчика в Яндекс
«В день уходит несколько часов на созвоны, в остальное время закрываю задачки из спринта, редко перерабатываю. У компании топовый офис, но с коллективом как-то не заладилось. Радуюсь классному ДМС и стабильной зарплате» - middle разработчик из Яндекса.
Бигтех по-русски - канал с реальными зарплатами и историями IT-специалистов российского БигТеха. Там уже опубликованы рассказы программистов Альфа-банка, Сбера и Тинькофф 🤯
Читайте: @bigtech_russia
6 954
📦 Records 🆚 Sealed Classes — компактность и контроль
Record убирает шаблонный код и делает объект иммутабельным.
Sealed Class закрывает иерархию и контролирует наследование.
Разные задачи, но вместе решают боль старой Java.
🧩 Record вместо POJO
public record User(String name, int age) {}
➡️ Всё сгенерировано: геттеры, equals, hashCode, toString.
➕ Лаконичность, минимум шаблонов.
➖ Изменять поля нельзя.
📜 Класс вручную vs record
class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String name() { return name; }
public int age() { return age; }
}
➡️ Один record = десяток строк кода.
⚙️ Record с валидацией
public record Product(String name, int price) {
public Product {
if (price < 0) throw new IllegalArgumentException("price < 0");
}
}
➡️ Можно добавлять логику в compact-конструкторе.
🔒 Sealed Class: ограниченная иерархия
public sealed class Shape permits Circle, Rectangle {}
public final class Circle extends Shape {}
public final class Rectangle extends Shape {}
➡️ Никто не добавит новый Shape без изменения sealed-класса.
🎯 Record внутри sealed
public sealed interface Payment
permits CardPayment, CashPayment {}
public record CardPayment(String number) implements Payment {}
public record CashPayment(double amount) implements Payment {}
➡️ Удобное комбо: варианты — records, интерфейс — sealed.
🔎 Pattern Matching по sealed
Payment p = new CardPayment("1234");
switch (p) {
case CardPayment c -> System.out.println("💳 " + c.number());
case CashPayment c -> System.out.println("💵 " + c.amount());
}
➡️ Компилятор гарантирует, что обработаны все варианты.
📐 Sealed vs enum
sealed interface Command permits Reboot, Shutdown {}
record Reboot() implements Command {}
record Shutdown() implements Command {}
➡️ Как enum, но гибче: каждая ветка со своей структурой.
🧮 Комбинации records + sealed
sealed interface Event permits Login, Logout {}
record Login(String user) implements Event {}
record Logout(String user) implements Event {}
➡️ Модель событий простая, неизменяемая и закрытая.
🗣️Запомни:Record = компактный неизменяемый объект вместо шаблонного класса. Sealed Class = закрытая иерархия и контроль наследников.Вместе дают лаконичность и безопасность, снимая боль старой Java.6 954
🔥Приглашаем разработчиков на новый курс "Деплой микросервисов в Kubernetes. Helm"!
По ранней цене, в несколько раз ниже стоимости аналогичных программ на рынке (обычно от 40 000 до 100 000 рублей)!
Вместе с вами мы:
✅ разберём ключевые концепции деплоя микросервисов в кластер
✅ потренируемся с развёртыванием тестовых контейнеров
✅ подготовим production-ready манифесты и Helm-чарты для полноценного приложения: 6 бизнесовых микросервисов и 10 инфраструктурных компонентов (Loki, Tempo, Grafana, Keycloak, Kafka, Kafka Connect, Confluent Schema Registry, Redis, Postgres)
🔥 В результате обучения у вас будет не только понимание принципов, но и опыт в развертывании в кластере Kubernetes крупного проекта. После прохождения выдается электронный сертификат об окончании курса
Получи полноценный опыт Middle|Senior разработчика
➕ Доступен выгодный пакет с курсом Java Микросервисы, Kafka, Docker, Spring Cloud, Spring WebFlux
6 954
🛡 Java Flight Recorder + JFR Events API — профилирование прямо в коде
Обычно JFR включают флагами JVM, но начиная с Java 14 появился Events API. Теперь можно описывать и логировать свои события прямо из кода, без тяжёлых логгеров.
📦 Определение кастомного события
import jdk.jfr.Event;
import jdk.jfr.Label;
class LoginEvent extends Event {
@Label("User")
String username;
@Label("Success")
boolean success;
}
➡️ Наследуем Event и описываем поля — это как лог-сообщение, но встроенное в JVM.
🚀 Публикация события
LoginEvent e = new LoginEvent();
e.username = "ivan";
e.success = true;
e.commit();
➡️ commit() записывает событие в JFR-файл, который потом анализируется в Mission Control.
🖥 Запуск записи профиля
java -XX:StartFlightRecording=filename=recording.jfr,duration=20s -jar app.jar
➡️ Даже без кода можно собрать JFR-трассу, но с Events API появляются свои бизнес-события.
📊 Использование категорий
import jdk.jfr.Category;
@Category("Auth")
class LoginEvent extends Event {
String username;
}
➡️События группируются в категории, и в Mission Control они будут выделены как отдельный блок.
⚡️ События с таймингом
class CalcEvent extends Event {}
CalcEvent e = new CalcEvent();
e.begin();
// тяжёлая операция
e.end();
e.commit();
➡️ begin()/end() автоматически меряют длительность и пишут её в метрику.
🔗 Комбинация JFR с логами
LoginEvent e = new LoginEvent();
e.username = "alex";
e.success = false;
e.commit();
System.out.println("Login attempt failed: alex");
➡️ Лог для человека, JFR-событие для анализа и графиков — два уровня контроля.
🧩 Интеграция с потоками
class TaskEvent extends Event {
String thread;
}
TaskEvent e = new TaskEvent();
e.thread = Thread.currentThread().getName();
e.commit();
➡️Можно писать, какие потоки нагружают систему и когда они стартуют.
📑 Анализ в Mission Control
Открываешь recording.jfr — и видишь всё: GC, потоки, задержки и свои кастомные события.
🗣️ Запомни: JFR Events API — это быстрый встроенный профайлинг. Свои события почти не грузят систему, пишутся дешевле логов и помогают находить проблемы прямо в продакшене.6 954
Как вы решаете вопрос с покрытием?
Почти в каждом проекте висит задача: поднять покрытие до 70%.
И почти в каждой команде никто не хочет этим заниматься.
Explyt – AI-плагин для Java и Kotlin разработчиков, который снимает эту боль.
Он генерирует юнит-тесты прямо в IDE: по коду, по runtime-трассам, по спекам. И делает это так, как будто реально вник в проект.
📌 Что умеет:
- создаёт осмысленные тесты для Java и Kotlin-кода
- поддерживает JUnit 4/5, TestNG, кастомные фреймворки
- превращает execution trace в автотесты
- предлагает фиксы, если сгенерированный тест падает
- есть режим агента, где AI сам меняет код, запускает тесты и ищет ошибки
📦 Плагин доступен:
- через JetBrains Marketplace
- или напрямую с сайта разработчика
🎁 30 дней бесплатного доступа – просто пользуйтесь.
👉 Попробовать на своём проекте
6 954
⚡️ Panama API + MemorySegment — работа с off-heap памятью без Unsafe
Когда нужен прямой доступ к памяти без
Unsafe и JNI — помогает Panama API.
MemorySegment и MemorySession позволяют работать с off-heap памятью безопасно, быстро и управляемо.
📦 Выделение памяти вне heap
try (var session = MemorySession.openConfined()) {
MemorySegment segment = MemorySegment.allocateNative(100, session);
System.out.println("Размер: " + segment.byteSize());
}
➡️ Память выделяется за пределами JVM heap, но управляется сессией.
🔗 Запись и чтение примитивов
try (var session = MemorySession.openConfined()) {
MemorySegment seg = MemorySegment.allocateNative(8, session);
seg.set(ValueLayout.JAVA_INT, 0, 42);
int x = seg.get(ValueLayout.JAVA_INT, 0);
System.out.println(x);
}
➡️ Читаем и пишем напрямую, как в массив, только в off-heap памяти.
⚡️ Работа с массивами
try (var session = MemorySession.openConfined()) {
MemorySegment seg = MemorySegment.allocateNative(4 * 5, session);
for (int i = 0; i < 5; i++) {
seg.setAtIndex(ValueLayout.JAVA_INT, i, i * 10);
}
System.out.println(seg.getAtIndex(ValueLayout.JAVA_INT, 3));
}
➡️ setAtIndex и getAtIndex делают сегмент похожим на массив.
🌀 MemorySession = контроль жизни
MemorySegment seg;
try (var session = MemorySession.openConfined()) {
seg = MemorySegment.allocateNative(16, session);
}
System.out.println(seg.isAlive()); // false
➡️ После закрытия сессии память освобождается, сегмент становится "мертвым".
📑 Slice и view памяти
try (var session = MemorySession.openConfined()) {
MemorySegment seg = MemorySegment.allocateNative(16, session);
MemorySegment part = seg.asSlice(4, 8);
System.out.println("Slice: " + part.byteSize());
}
➡️ Можно создавать "представления" (slice) на часть памяти.
🚀 Обмен с native-кодом
try (var session = MemorySession.openConfined()) {
MemorySegment seg = MemorySegment.allocateNative(4, session);
seg.set(ValueLayout.JAVA_INT, 0, 123);
long addr = seg.address();
System.out.println("Адрес: " + addr);
}
➡️ Сегмент даёт доступ к "сырому" адресу для интеграции с нативными API.
🗣️ Запомни: Off-heap ускоряет работу с большими данными и нативным кодом без GC overhead.6 954
🔍Тестовое собеседование с Java-разработчиком из МТС уже завтра
1 октября (уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Илья Аров, старший разработчик в МТС, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Илья будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Илье
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
6 954
☕️ Создание классов и объектов
В этом видео автор показывает, как в Java создавать собственные классы и объекты. Разбирается структура класса, определение полей и методов, а также процесс создания экземпляров через ключевое слово new. Это практическая основа объектно-ориентированного программирования, без которой невозможно двигаться дальше.🗣️Запомни: умение создавать классы и объекты — фундамент для понимания всей работы с ООП в Java. 🤩 Java Фишки и трюки || #Видео
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
