en
Feedback
Java | Фишки и трюки

Java | Фишки и трюки

Open in Telegram

Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna

Show more
6 954
Subscribers
-724 hours
+117 days
+830 days
Posts Archive
☕️Наследование в классах
В этом видео автор подробно объясняет концепцию наследования в Java: как один класс может наследовать свойства и методы другого, когда применять `extends`, как переопределять методы и использовать ключевое слово `super`.
🗣️Запомни: наследование — мощный механизм для повторного использования кода и организации иерархий классов. 🤩 Java Фишки и трюки || #Видео

🤝 «Контракты не лгут: как сервисы общаются без боли» 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 — это «юридическая проверка» между сервисами.

🔍Тестовое собеседование с Java-разработчиком из Мегафон уже завтра 15 октября(уже завтра!) в 19:00 по мск приходи онлайн на
🔍Тестовое собеседование с Java-разработчиком из Мегафон уже завтра 15 октября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Мария Пивоварова, старший разработчик в Мегафон, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Мария будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Марии Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. О рекламодателе.

🛰 «Смотри глубже: 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 ≠ просто мониторинг — это понимание поведения системы.

Карьерный буст, робот в подарок и призовой фонд 7 500 000 рублей 🤖 Успей зарегистрироваться до 20 октября. Все это ждет учас
Карьерный буст, робот в подарок и призовой фонд 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 октября.

🔥 «Когда поток — это архитектура» 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 — это код, который живёт в потоке данных.

День открытых дверей онлайн-программы «Frontend-разработчик» Центр непрерывного образования ФКН НИУ ВШЭ открывает набор на об
День открытых дверей онлайн-программы «Frontend-разработчик» Центр непрерывного образования ФКН НИУ ВШЭ открывает набор на обучение фронтенд-разработке. Слушатели познакомятся с HTML, CSS, JavaScript, TypeScript, React.js. Программа включает создание адаптивных пользовательских интерфейсов, работу с одностраничными приложениями (SPA) и реализацию итоговых проектов. Узнать подробнее о онлайн-курсе по фронтенду вы сможете на Дне открытых дверей: 🟣как устроена веб-разработка 🟣кто такие фронтенд-разработчики и чем они занимаются 🟣что умеет делать фронтендер и почему карьера в разработке является интересной и перспективной 🟣какие знания вы приобретете на курсе и какие навыки сформируете в процессе обучения 🟣как получить максимальную пользу от занятий на курсе Спикеры: 🎙Андрей Сухов, старший эксперт по технологиям в Сбере и преподаватель онлайн-курса «Frontend-разработчик» Центра непрерывного образования ФКН. 🎙Таисия Ахматова, менеджер по работе со слушателями и организации учебного процесса Центра непрерывного образования ФКН. Когда: 8 октября в 18:30. Регистрация 📍 Реклама. НИУ "ВШЭ". ИНН 7714030726. erid: 2SDnjdk7EEb

🧩 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 уходит в прошлое. Скорость и контроль — без риска.

В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн Но где их находить? Как узнавать о них ран
В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн Но где их находить? Как узнавать о них раньше, чем когда все начнут выкладывать фотографии оттуда? Переходите на канал IT-Мероприятия России. В нём каждый день анонсируются мероприятия со всех городов России 📆 в канале размещаются как онлайн, так и оффлайн мероприятия; 👩‍💻 можно найти ивенты по любому стеку: программирование, frontend-backend разработка, кибербезопасность, дата-аналитика, osint, devops и другие; 🎙 разнообразные форматы мероприятий: митапы с коллегами по цеху, конференции и вебинары с известными опытными специалистами, форумы и олимпиады от важных представителей индустрии и многое другое А чтобы не искать по разным форумам и чатам новости о предстоящих ивентах: 🚀 IT-мероприятия Россииподписывайся и будь в курсе всех предстоящих мероприятий!

⚡️ 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-тредов.

⚡️Группа хакеров взломала сервера Skillbox, Geekbrains, Skillfactory и ещё 12 онлайн-школ, чтобы выгрузить их курсы в Telegra
⚡️Группа хакеров взломала сервера 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

⌨️ Что такое текстовые блоки (Text Blocks)? Text Blocks (""") позволяют удобно работать с многострочными строками без необходимости экранировать кавычки. Улучшают читаемость кода. Поддерживают форматирование и перенос строк. Упрощают работу с JSON, SQL и HTML. ✔️ Пример:

String json = """
    {
        "name": "Alice",
        "age": 30
    }
    """;

System.out.println(json);
💡 Совет: Используйте Text Blocks для удобного написания больших строковых данных. #java #textblocks #java15

Зарплата 207.000р у Middle-разработчика в Яндекс «В день уходит несколько часов на созвоны, в остальное время закрываю задачк
Зарплата 207.000р у Middle-разработчика в Яндекс «В день уходит несколько часов на созвоны, в остальное время закрываю задачки из спринта, редко перерабатываю. У компании топовый офис, но с коллективом как-то не заладилось. Радуюсь классному ДМС и стабильной зарплате» - middle разработчик из Яндекса. Бигтех по-русски - канал с реальными зарплатами и историями IT-специалистов российского БигТеха. Там уже опубликованы рассказы программистов Альфа-банка, Сбера и Тинькофф 🤯 Читайте: @bigtech_russia

📦 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.

🔥Приглашаем разработчиков на новый курс "Деплой микросервисов в Kubernetes. Helm"! По ранней цене, в несколько раз ниже стои
🔥Приглашаем разработчиков на новый курс "Деплой микросервисов в 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

🛡 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 — это быстрый встроенный профайлинг. Свои события почти не грузят систему, пишутся дешевле логов и помогают находить проблемы прямо в продакшене.

Как вы решаете вопрос с покрытием? Почти в каждом проекте висит задача: поднять покрытие до 70%. И почти в каждой команде ник
Как вы решаете вопрос с покрытием? Почти в каждом проекте висит задача: поднять покрытие до 70%. И почти в каждой команде никто не хочет этим заниматься. Explyt – AI-плагин для Java и Kotlin разработчиков, который снимает эту боль. Он генерирует юнит-тесты прямо в IDE: по коду, по runtime-трассам, по спекам. И делает это так, как будто реально вник в проект. 📌 Что умеет: - создаёт осмысленные тесты для Java и Kotlin-кода - поддерживает JUnit 4/5, TestNG, кастомные фреймворки - превращает execution trace в автотесты - предлагает фиксы, если сгенерированный тест падает - есть режим агента, где AI сам меняет код, запускает тесты и ищет ошибки 📦 Плагин доступен: - через JetBrains Marketplace - или напрямую с сайта разработчика 🎁 30 дней бесплатного доступа – просто пользуйтесь. 👉 Попробовать на своём проекте

⚡️ 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.

🔍Тестовое собеседование с Java-разработчиком из МТС уже завтра 1 октября (уже завтра!) в 19:00 по мск приходи онлайн на откр
🔍Тестовое собеседование с Java-разработчиком из МТС уже завтра 1 октября (уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Илья Аров, старший разработчик в МТС, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Илья будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Илье Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. О рекламодателе.

☕️ Создание классов и объектов
В этом видео автор показывает, как в Java создавать собственные классы и объекты. Разбирается структура класса, определение полей и методов, а также процесс создания экземпляров через ключевое слово new. Это практическая основа объектно-ориентированного программирования, без которой невозможно двигаться дальше.
🗣️Запомни: умение создавать классы и объекты — фундамент для понимания всей работы с ООП в Java. 🤩 Java Фишки и трюки || #Видео