№ 4931127152 Изучаем Java. По вопросам сотрудничества: @adv_and_pr Канал на бирже: https://telega.in/c/seniorjavist
🦾Хотите глубже понять управление процессами в микросервисах и повысить надёжность систем? На ум сразу приходят распределённые транзакции – классический, но, увы, проблематичный метод. Но мы предлагаем кое-что получше: шаблон «Сага»!
На открытом вебинаре "«Саги» vs распределённые транзакции: как моделировать рабочие потоки в распределённой архитектуре"
Вы узнаете:
- Почему распределённые транзакции могут быть непрактичны в контексте микросервисов
- Как работает Сага и в чём преимущества этого шаблона
- Какие типы «саг» существуют и как их применять
- Как использовать Сагу для моделирования сложных рабочих потоков
И, конечно же, получите важные рекомендации по внедрению саг в реальных проектах.
Будет интересно архитекторам ПО, системным аналитикам, бэкенд и фулстек-разработчикам.
💬Спикер: Сергей Прощаев Java-разработчик в ПАО «Сургутнефтегаз».
Бонус! Скидка 5% на любой курс OTUS и чек-лист «Подойдёт ли вам шаблон SAGA? Семь вопросов создателю проекта»
⏰6 марта, 19:00 МСК, Бесплатно
Записаться на событие: https://otus.pw/jCI5/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
⚖️ 👩💻 Сравнение механизмов синхронизации потоков с помощью JMH
Понимание синхронизации — ключ к многопоточности. Оцените эффективность механизмов и проверьте гипотезы с помощью JMH.
🗓 13 марта в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Advanced».
📌О чём поговорим:
- Ключевые механизмы синхронизации в Java (synchronized, ReentrantLock и другие).
- Особенности их применения в многопоточном коде и влияние на производительность.
- Настройка и проведение бенчмарков JMH для объективного сравнения различных подходов.
📌Кому будет интересно:
Java-разработчикам, инженерам по производительности и любителям многопоточности, желающим оценить скорость и надёжность разных механизмов.
📌В результате урока вы получите:
- Навык реализации JMH-бенчмарков для сравнения различных инструментов синхронизации.
- Понимание разницы в скорости работы механизмов и уверенность в выборе оптимального решения.
🔗 Ссылка на регистрацию: https://otus.pw/oMyO/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
CountDownLatchCountDownLatch
— это синхронизационный механизм, предоставляемый пакетом java.util.concurrent
, который позволяет одному или нескольким потокам ждать, пока определенное количество операций завершится, прежде чем они смогут продолжить свою работу. Он полезен в ситуациях, когда нужно дождаться завершения нескольких параллельных задач, прежде чем продолжить выполнение кода.CountDownLatch
работает по принципу счетчика, который уменьшается с каждым вызовом метода countDown()
. Когда счетчик достигает нуля, все ожидающие потоки могут продолжить свою работу.
#для_продвинутых
Spring Batch
Spring Batch — это фреймворк для обработки больших объемов данных в приложениях Java. Он предоставляет множество инструментов и функциональности для управления и выполнения множества задач в пакетном режиме, таких как чтение, обработка и запись данных. Spring Batch обеспечивает множество возможностей для управления ошибками, масштабируемостью и мониторингом задач.
#для_продвинутых
IllegalStateExceptionIllegalStateException
является исключением (exception), которое указывает на то, что метод был вызван в недопустимом или неправильном состоянии объекта. Это исключение обычно выбрасывается, когда какая-то операция не может быть выполнена, потому что объект находится в некорректном состоянии.
В примере на картинке, если метод performOperation
вызывается до того, как объект будет инициализирован методом initialize
, то будет выброшено исключение IllegalStateException
. Также, если попытаться повторно инициализировать объект, снова будет выброшено исключение IllegalStateException
.
#для_продвинутых
🦾👩💻Хардкорный тест по языку Java👩💻🦾
👩💻 Пройдите тест из 21 вопроса и проверьте, насколько вы готовы к обучению на углубленном курсе «Разработчик на Spring Framework» от OTUS.
Сможете сдать - пройдете на курс по спеццене!
💻 За 5 месяцев обучения вы освоите современные возможности Spring, научитесь быстро проходить путь от идеи до production-grade, создавать Web-приложения на микросервисной архитектуре и решать высокоуровневые задачи по разработке.
⏰ Время прохождения теста ограничено 30 минут
👉 ПРОЙТИ ТЕСТ: https://otus.pw/FSK4/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Метод putAll()
Метод putAll()
принадлежит интерфейсу Map
и используется для добавления всех элементов из одной карты (Map) в другую. Этот метод принимает в качестве аргумента другую карту и добавляет все ее записи в вызывающую карту.
Например, если у вас есть две карты, содержащие данные, и вам нужно объединить их для выполнения операций на полном объеме данных, метод putAll()
предоставляет простой способ объединения.
#для_начинающих
Метод startsWith()
Метод startsWith()
является частью класса String и используется для проверки того, начинается ли строка с определенной подстроки. Вот сигнатура метода:
public boolean startsWith(String prefix)
true
, если вызывающая строка начинается с указанного префикса (prefix
), и false
в противном случае.Метод compareTo()
Метод compareTo()
используется для сравнения двух объектов. Обычно он применяется к объектам, реализующим интерфейс Comparable
, чтобы определить их относительный порядок. Вот как обычно выглядит сигнатура метода compareTo()
:
int compareTo(T obj)
T
— это тип объектов, с которыми сравнивается текущий объект. Метод возвращает отрицательное целое число, ноль или положительное целое число в зависимости от того, как текущий объект сравнивается с переданным объектом obj.obj
.obj
.obj
.🎥 Приглашаем вас на вебинар "Обзор децентрализованных web3 приложений (dApp) 2025 года".
📝 На уроке:
- Проведём обзор самых интересных и перспективных децентрализованных приложений (dApp), которые сейчас активно развиваются в экосистеме Web3.
- Узнаете, как устроены dApp, какие технологии лежат в их основе (блокчейн, смарт-контракты, криптография) и как они меняют привычные подходы к взаимодействию пользователей с интернетом.
- Разберём примеры из разных сфер: DeFi (децентрализованные финансы), NFT, GameFi, социальные сети и другие.
💪 В результате получите:
- Понимание, что такое dApp и как они работают.
- Обзор самых популярных и инновационных децентрализованных приложений.
- Представление о том, как можно использовать dApp в различных сферах жизни.
- Вдохновение и идеи для собственных проектов в Web3.
Приходите на вебинар и получите скидку на большое обучение «Solidity Developer» и выходите на новый уровень в блокчейн-разработке.
Для участия зарегистрируйтесь: https://otus.pw/YTeG/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Single Responsibility Principle
Принцип единственной ответственности (Single Responsibility Principle, SRP) является одним из принципов SOLID, предложенных Робертом Мартином. Этот принцип гласит, что у класса должна быть только одна причина для изменения. Иными словами, класс должен выполнять только одну ответственность.
Применительно к Java это означает, что класс должен быть спроектирован так, чтобы он занимался только одним аспектом функциональности. Если у класса есть более одной обязанности, его стоит разделить на несколько классов, каждый из которых будет отвечать за свою конкретную обязанность.
#для_продвинутых
А всё, а раньше надо было!
Именно это скажут вам потерянные данные, когда из Кафки они превратятся в кашку. Лучше разбираться в инструменте до того, как начнёшь с ним работать по-серьёзному — не только в теории, но и на практике.
Пока все данные на месте, приходите на «Apache Kafka для разработчиков»:
➡️ Разберётесь в основах Kafka, её архитектуре и бизнес-процессах.
➡️ Научитесь работать с системами, передающими и получающими большие объёмы сообщений.
➡️ Подготовитесь к базовым собеседованиям на позиции, связанные с Kafka.
Углубленный курс с практикой на Java, Docker и Postgres.
▶️Занять место — по ссылке
#реклама
О рекламодателе
BeanPostProcessorBeanPostProcessor
— это интерфейс в Spring Framework, который позволяет разработчикам расширять логику создания бинов. BeanPostProcessors
вызываются после того, как бин был создан и проинициализирован, но до того, как он будет зарегистрирован в контейнере Spring.BeanPostProcessors
имеют два метода обратного вызова:postProcessBeforeInitialization(Object bean, String beanName)
: вызывается перед тем, как будет вызван метод init()
бина.postProcessAfterInitialization(Object bean, String beanName)
: вызывается после того, как будет вызван метод init()
бина.
#для_продвинутых
Класс Throwable
Класс Throwable
является суперклассом для всех ошибок и исключений. Объекты класса Throwable
используются для представления нештатных ситуаций, которые могут возникнуть во время выполнения программы.
Класс Throwable
имеет следующие важные методы:getMessage()
— возвращает строковое сообщение, описывающее исключение.printStackTrace()
— выводит в стандартный поток ошибок подробную информацию об исключении, включая его тип, сообщение и стек вызовов.
Исключения делятся на две категории: ошибки и исключения. Ошибки являются необратимыми ситуациями, которые приводят к завершению работы программы. Исключения же являются обратимыми ситуациями, которые можно обработать и продолжить выполнение программы.
#для_продвинутых
#вопросы_с_собеседований
Что будет, если в static блоке кода возникнет исключение?
Если в static блоке кода возникнет исключение, то это приведет к ошибке инициализации класса.
Static блок выполняется при загрузке класса, и любые исключения в нем приведут к сбою и невозможности загрузить класс.
Поэтому нужно либо обрабатывать исключения в static блоке, либо избегать кода, который может привести к исключениям.
Лучше выносить в static блок только простую инициализацию, а сложную логику помещать в конструктор или методы класса.
CompletableFutureCompletableFuture
представляет собой мощный и гибкий механизм для асинхронного программирования и выполнения параллельных задач. Этот класс был введен в Java 8 и предоставляет более высокоуровневый интерфейс для работы с асинхронными операциями, чем традиционные Future
и ExecutorService
.
#для_продвинутых
BeanFactoryBeanFactory
— это интерфейс, определенный в фреймворке Spring, который предоставляет механизм для управления бинами (объектами), инверсии управления (IoC) и внедрения зависимостей (DI). Spring использует этот интерфейс для создания и управления бинами, которые представляют собой объекты, управляемые контейнером Spring.
На картинке XmlBeanFactory
используется для создания контейнера бинов на основе конфигурационного файла beans.xml
. В этом файле определяется бин с именем «helloWorld», и экземпляр этого бина извлекается из BeanFactory
и использован.
Важно отметить, что XmlBeanFactory
является устаревшим в новых версиях Spring. Вместо него рекомендуется использовать ApplicationContext
, который предоставляет дополнительные функции и улучшенную производительность.
#для_продвинутых
⁉️ По-прежнему перебираете списки с for и while? Код превращается в кашу из циклов и условий?
Оптимизация занимает больше времени, чем сам проект?
👩💻 Stream API — мощный инструмент, который позволит вам писать элегантный, лаконичный и производительный код.
⚡️ На открытом вебинаре 13 марта в 20:00 мск разберём ключевые операции Stream API, научимся фильтровать, группировать и трансформировать данные в несколько строк кода.
🎙 Спикер Александр Фисунов — Senior Kotlin Developer в SSP Software на проекте ВТБ, опытный Java-разработчик и кандидат технических наук.
Участники вебинара получат скидку для обучение на курсе «Java-разработчик»
🔗 Ссылка на регистрацию: https://otus.pw/Kx3s/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Метод System.nanoTime()
Метод System.nanoTime()
используется для получения текущего времени в наносекундах. Этот метод обычно используется для измерения времени выполнения участка кода или производительности приложения с высокой точностью.
#для_начинающих
Метод isEmpty()
Метод isEmpty()
используется для проверки, пуст ли объект типа String
. Этот метод возвращает true
, если строка не содержит символов, и false
в противном случае.
В примере на картинке str1.isEmpty()
вернет true
, потому что str1
не содержит символов, в то время как str2.isEmpty()
вернет false
, так как str2
содержит текст.
Учтите, что метод isEmpty()
доступен только для объектов типа String
в Java. Если вы хотите проверить пустоту другого объекта, вам может потребоваться использовать другие методы или проверки в зависимости от типа объекта.
#для_начинающих
Ветвление switch
В Java существует два основных типа ветвлений: if...else и switch. Первый тип проверят некое условие и если оно верно — выполняет код.
В свою очередь switch получает на вход проверяемое значение и сравнивает его с перезаписанными данными. Если какой-то случай case совпадает, то JVM выполняет соответствующий код.
Отличительной особенностью switch есть то, что все его условия статические и компилируются сразу в байткод.
#для_начинающих
⚡️ Квиз на знание Java
Пройти тестирование — сложно! А ты справишься?
22 вопроса, 30 минут
Проверь себя - пройди квиз и оцени свой уровень навыков, а также свою готовность к обучению на курсе — «Java Developer. Advanced» от Отус.
👩💻 На курсе ты научишься профилировать приложения, настраивать GC, работать с реактивными подходами и мониторить метрики в Grafana. Пройдешь весь путь от JVM до Kubernetes, научишься анализировать «горячие точки», оптимизировать приложения и настраивать интеграции с Prometheus.
➡️ ПРОЙТИ ТЕСТ: https://otus.pw/Hevf/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
⚡️👩💻 Освой Java с нуля и начни карьеру успешного разработчика!
Мечтаешь вкатиться в IT, но думаешь, что уже поздно? Java — язык, на котором работают крупнейшие компании мира! Тебе точно найдется место.
🦾 Наше обучение на курсе "Java-разработчик" — это 3 ступени, которые проведут тебя от новичка до уверенного Middle-разработчика. Ты освоишь Spring, Hibernate, PostgreSQL, Docker, Kafka, Kubernetes и другие актуальные технологии!
Программа составлена практикующими экспертами, а диплом OTUS востребован в ведущих IT-компаниях. Наш партнер — СберКорус, разработчик передовых цифровых решений!
👉 Оставь заявку и получи скидку на курс: https://otus.pw/qNbW/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
PhaserPhaser
очень похож на более известную CountDownLatch
. Однако он предоставляет некоторые дополнительные функции. Он позволяет нам установить динамическое количество потоков, которые должны ждать перед продолжением выполнения.
С Phaser
определенное количество потоков должно дождаться барьера, прежде чем перейти к следующей фазе выполнения. Благодаря этому мы можем координировать несколько фаз выполнения.
#для_продвинутых
StringJoinerStringJoiner
— это класс в Java, введенный в Java 8, который предоставляет удобный способ объединения строк с использованием разделителя. Этот класс обеспечивает более гибкий и выразительный способ объединения строк, чем использование обычных конкатенаций строк или метода StringBuilder
.
В примере выше создается объект StringJoiner
с разделителем ",". Затем добавляются три элемента ("Apple", "Banana", "Orange"). В результате вызова метода toString()
получается строка, в которой элементы объединены с использованием заданного разделителя.
#для_продвинутых
Трюк с битовыми операциями
Этот код демонстрирует обмен значений двух переменных (a и b) без использования дополнительной временной переменной.
Он использует битовую операцию XOR (^). Ключевой момент здесь в том, что XOR двух одинаковых чисел возвращает 0, а XOR числа с 0 возвращает само это число. Таким образом, когда мы применяем XOR к a и b и затем обратно, мы фактически обмениваем их значения.
Блокирующий метод
Блокирующий метод — это метод, который временно останавливает выполнение текущего потока до завершения определенного условия или операции. Блокирующие методы часто используются для синхронизации работы потоков или для ожидания определенных условий.
Существует несколько способов сделать метод блокирующим. Один из способов — это использовать ключевое слово synchronized
. Метод, помеченный ключевым словом synchronized
, блокирует объект, на котором он вызывается. Это означает, что ни один другой поток не может вызвать этот метод, пока он не будет завершен.
Метод на картинке блокирует объект, на котором он вызывается, до тех пор, пока он не завершит свою работу.
#для_начинающих
⁉️👩💻Разрабатываете на Java, но проект на Spring превращается в черный ящик? Бины ведут себя непредсказуемо, конфигурация разрастается, а ошибка в одном модуле рушит всю систему.
Интервью на позицию Middle неудачно — не хватает уверенности в Spring.
🤝 Тем временем рынок требует специалистов, которые не просто знают Spring, а умеют строить продакшен-приложения с его помощью. Компании ищут разработчиков, которые понимают, как работают Spring Boot, Spring Security, Spring MVC и могут строить микросервисную архитектуру.
⚡️ На курсе «Разработчик на Spring Framework» мы закроем пробелы и дадим актуальные навыки. Практика на реальных кейсах, ревью заданий, тестовое собеседование — вы освоите Spring так, чтобы уверенно применять его в работе.
➡️ Пройдите вступительное тестирование и получите скидку на обучение: https://otus.pw/2NMR/
🎫 Курс можно приобрести в рассрочку
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👩💻 Создание 2D RPG игры на Java 👩💻
На открытом вебинаре вы создадите свою первую 2D RPG на Java с LibGDX, увидите, как код управляет миром игры, и освоите ключевые принципы программирования.
🗓 26 февраля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java-разработчик».
Это не просто теория — это реальный проект, который поможет вам понять логику Java-разработки и ускорить ваш путь к первому коммерческому коду.
Спикер Александр Фисунов — Senior Kotlin Developer в SSP Software на проекте ВТБ, опытный Java-разработчик и кандидат технических наук.
🔗 Ссылка на регистрацию: https://otus.pw/gaFF/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
#вопросы_с_собеседований
В чем разница между Iterator и Enumeration?
— Iterator появился в JDK 1.2 и реализует интерфейс Iterable, в то время как Enumeration существовал в более ранних версиях JDK и не реализует Iterable.
— Методы Iterator позволяют удалять элементы во время итерации, в то время как методы Enumeration не предоставляют такой возможности.
— Iterator является "fail-fast", то есть выбросит ConcurrentModificationException, если коллекция была изменена, а Enumeration не гарантирует такого поведения.
— Iterator поддерживает обобщенные типы, а Enumeration работает только с объектами типа Object.