Java Guru 🤓
13.3K subscribers
938 photos
15 videos
793 links
Канал с вопросами и задачами с собеседований!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrSQZ

Мы на бирже: telega.in/channels/javatasks/card?r=lcDuijdm
Download Telegram
🟥 Мастхэв-мероприятие для Java-разработчиков

🔄 Бесплатный открытый урок «Транзакции в Kafka» от OTUS.

Что будет на занятии:

- Посмотрим, как чтение данных из Kafka можно сделать транзакционным.
- В ряде случаев требуется дополнительно обеспечить корректность обработки данных – изучим, как это можно реализовать.

Преподаватель Сергей Петрелевич – Java-разработчик, в отрасли с 2003 года. Программировать начал со времен ZX-Spectrum. 8 лет в разработке банковских процессинговых систем пластиковых карт.

🌐 Занятие пройдёт 27 сентября в 20:00 мск в рамках курса «Java Developer. Professional».

Это отличная возможность совершенно бесплатно протестировать формат обучения и задать преподавателю любые вопросы в режиме реального времени!

Пройдите бесплатное вступительное тестирование прямо сейчас и зарегистрируйтесь на событие:

➡️ Пройти тест

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Какие данные есть в исключении?

Разработчик может добавлять в исключение, как и в любой другой класс, произвольные поля и методы. Но у всех исключений есть общая часть, унаследованная от Throwable. В базовых Exception, RuntimeException и Error нет ничего кроме неё.

Cause – другое исключение, которым было вызвано это. Опционально. Можно задать через сеттер или аргумент конструктора, но задается не больше одного раза.

Message – сообщение ошибки. Устанавливается в конструкторе. Кроме обычного геттера есть getLocalizedMessage, который в наследниках может возвращать локализованный вариант сообщения.

Stack Trace – стек вызовов методов потока до того места, где сообщение было сконструировано (не выброшено!). JVM позволено терять часть, или даже все фреймы стека. Есть сеттер для фреймворков удаленного вызова (RPC). Сеттер можно отключить параметром конструктора writableStackTrace.

Suppressed – список исключений, которые были выброшены и подавлены, пока это исключение шло к обработчику. Сюда попадают подавленные исключения финализации ресурсов при использовании try-with-resource. Сеттер доступен и для пользовательского кода. Подавление можно отключить параметром конструктора enableSuppression.
👍14🔥1
Каким будет результат работы программы?
👍10🔥62
Каким будет результат работы программы?
Anonymous Quiz
27%
777
36%
666
11%
777 666
25%
ошибка компиляция
2%
ошибка времени выполнения
👍20🔥5
Как управлять состоянием системы через события?

Event-driven архитектура
— концепция программирования, которая позволяет создавать сложные приложения, используя событийно-ориентированный подход. Так создаются распределенные системы, которые легко масштабируются и обладают высокой отказоустойчивостью.
Начните изучать эту технологию на бесплатном открытом уроке «Архитектурный подход Event Driven Architecture» от OTUS.

На занятии рассмотрим:

✔️ взаимодействие сервисов на основе событий;
✔️ плюсы и минусы такого подхода;
✔️ сочетания событийного и синхронного взаимодействия;
✔️ паттерны проектирования событий;
✔️ подход Event Sourcing и CQRS.

Урок пройдёт 27 сентября в 20:00 мск в рамках курса «Microservice Architecture».

👩‍💻 Пройдите вступительное тестирование прямо сейчас и зарегистрируйтесь на событие: https://otus.pw/IkhN/
👍5🔥2
Какие значения возвращают мутаторы Map?

Давайте разберемся с этой путаницей раз и навсегда.

• Методы put (put, putIfAbsent) возвращают старое значение.

• Методы работы с множеством элементов (putAll, replaceAll, clear) не возвращают ничего.

• remove и replace с указанием не только ключа, но и старого значения, возвращают boolean; без указания – это самое старое значение.

• Методы с коллбэками (computeIfPresent, computeIfAbsent, compute, merge) возвращают актуальное значение после вызова, оставшееся или новое.
👍16🔥5
🔥 Переходи на новый уровень в Java и разнообразь свою работу!

Пройди тест по Java и проверь как хорошо ты знаешь язык.

Ответишь — пройдешь на продвинутый курс «Java Developer. Professional» от OTUS по специальной цене + получишь масстер-класс от преподавателя

👉 ПРОЙТИ ТЕСТИРОВАНИЕ

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍5
Зачем выбирать ReentrantLock вместо synchronized?

Объект класса ReentrantLock решает те же задачи, что и блок synchronized. Поток висит на вызове метода lock() в ожидании своей очереди занять этот объект. Владеть локом, как и находиться внутри блока synchronized может только один поток одновременно. unlock(), подобно выходу из блока синхронизации, освобождает объект-монитор для других потоков.

В отличие от блока синхронизации, ReentrantLock дает расширенный интерфейс для получения информации о состоянии блокировки. Методы лока позволяют еще до блокировки узнать, занят ли он сейчас, сколько потоков ждут его в очереди, сколько раз подряд текущий поток завладел им.

Шире и возможные режимы блокировки. Кроме обычного ожидающего lock(), вариант tryLock() с параметром ожидает своей очереди только заданное время, а без параметра – вообще не ждет, а только захватывает свободный лок.

Еще одно отличие – свойство fair. Лок с этим свойством обеспечивает «справедливость» очереди: пришедший раньше поток захватывает объект раньше. Блок synchronized не дает никаких гарантий порядка.
👍13🔥51
Как используется метод Lock.newCondition()?

Если реализации интерфейса Lock представляют высокоуровневую альтернативу блока synchronized, то реализации его спутника, интерфейса Condition – альтернатива методам notify/wait. Оба этих интерфейса относятся к пакету java.util.concurrent.locks.

Как и ожидание на мониторе, Condition реализует примитив синхронизации «Условная переменная». Один или несколько потоков зависают на объекте-кондишне с помощью варианта метода await (ждут удовлетворения условия). Другой поток пробуждает их методами signal и signalAll (сигнализирует об удовлетворении условия).

Конкретные реализации Condition всегда решают те же задачи, что блокировка на мониторе, но в теории могут отличаться в нюансах поведения. Например, может не быть требования вызывать ожидание/сигнал только при захваченном локе (аналог требования, по которому notify/wait всегда вызываются в synchronized). Или может гарантироваться порядок получения сигнала ожидающими потоками.

Возвращаясь к поставленному вопросу, Condition всегда связан со своим объектом типа Lock, и метод Lock.newCondition() – единственный правильный способ создания кондишна.
👍15🔥2
🔥 Проверьте, готовы ли вы изучить Apache Kafka?

Ответьте на 10 вопросов за 15 минут онлайн-курса «Apache Kafka» и узнайте, готовы ли вы к обучению в OTUS.

🟢 Пройти тестирование

➡️ В случае успешного прохождения вас ждут подарки – доступ к 3 открытым урокам для знакомства с форматом обучения и специальная цена на курс.

— «ksqlDB - анализируем потоки на SQL»
— «Kafka Streams»
— «Место Kafka в событийно-ориентированных системах»

💪 За 3 месяца обучения вы полностью освоите платформу Apache Kafka, а также научитесь работать с потоками на SQL (ksqlDB), познакомитесь со Schema Registry и освоите REST API.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2
Какая первая строка в этой программе станет причиной ошибки компиляции?
👍13🔥5
Какая первая строка в этой программе станет причиной ошибки компиляции?
Anonymous Quiz
10%
6
5%
7
20%
9
39%
10
6%
12
7%
13
12%
В этом коде нет ошибок
👍18🔥9
Как часто вы делаете code-review в своих проектах? 

Проверка кода – важная часть функционала разработчика, этот процесс помогает выявить ошибки, пропуски, уязвимости и стилистические недочеты. 

Хотите научиться правильно проводить ревью, чтобы повысить качество своих конечных результатов? 

Приходите на бесплатный открытый урок «Code-review онлайн» от OTUS.

Преподаватель курса «С# Developer Professional» Антон Герасименко, .net developer + lead с опытом в разработке более 10 лет:
— проведет code-review нескольких учебных проектов;
— расскажет о сode-review в целом: стоит ли его проводить, кому и когда он полезен.

🔥Во второй части урока у вас будет возможность отправить свой код и разобрать его вместе с преподавателем прямо на вебинаре!

📆 Занятие пройдёт 5 октября в 20:00 мск в рамках курса «C# Developer. Professional». После открытого урока вы сможете поступить на курс на специальных условиях.

➡️Пройдите бесплатное вступительное тестирование прямо сейчас и зарегистрируйтесь на событие: https://otus.pw/yMeG/

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Как получить текущий метод

В общем виде задача сводится к получению текущего стек-трейса, и взятию его верхнего элемента. Гарантированного способа не существует, потому что JVM имеет право «терять» фреймы стека (то есть методы цепочки вызовов) при оптимизации.

1. new Exception().printStackTrace(printStream)
Печатает стек-трейс в текстовом виде в поток. Первой строкой выводится toString() объекта Exception, далее стек вызовов до места создания исключения. Соответственно, из потока нужно будет достать и распарсить вторую строку. В зависимости от JVM формат вывода может отличаться.

2. Thread.currentThread().getStackTrace()
3. new Exception().getStackTrace()
Более красивые способы. Возвращают уже массив готовых объектов-фреймов, нужно только взять первый элемент. Эти вызовы дорогие, они всегда загружают весь стек, даже если нужен первый фрейм. От класса-владельца метода в возвращаемом StackTraceElement доступна только строка имени, для доступа через Reflection придется загружать его вручную.

4. StackWalker.getInstance(options, depth).walk(s -> ...)
Самый продвинутый способ, доступный с Java 9 – специально предназначенный для этого класс. Параметрами метода getInstance() можно ограничивать необходимую глубину и детализацию стека. Результаты – экземпляры StackFrame – содержат готовый для рефлекшна Class<?> вызывающего объекта.
👍16🔥6
🔥В OTUS продолжается набор в группу курса Kotlin Backend Developer Professional. Это отличная возможность расширить свои возможности разработки на Kotlin!

18 октября в 19:00 мск. приглашаем на бесплатный открытый урок «Возможности Kotlin для создания DSL на примере JsonBuilder».

⚡️На занятии:

- рассмотрим общую теорию о DSL: назначение, особенности, практика;
- попрактикуемся в создание DSL на примере JsonBuilder;
- рассмотрим возможности Kotlin, полезные для создания DSL;
- узнаем, как создавать собственные DSL и применять их при написании приложения;
- познакомимся с замыканиями и extension-методами.

Этот вебинар – мастхэв для начинающих и продвинутых Kotlin-разработчиков, которые хотят повысить свою ценность для работодателей.

Отправьте заявку, чтобы записаться на урок и получить спец. условия при поступлении в группу.

👉
Регистрация

❗️Легендой курса является разработка стартапа. В рамках легенды обсуждается реализация экстремальных проектов, в которых сочетаются высокая неопределенность и жесткие ограничения по времени и ресурсам. При покупке курса возможна рассрочка платежа. Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍5🔥2
Как применяют технологию SPI

Service Provider Interface – технология из стандартной поставки JavaSE. Этой технологией реализуется IoC, не являющаяся при этом DI. С помощью SPI можно легко и без дополнительных инструментов поставлять конкретные реализации сервисов отдельными jar-файлами. Применение обычно похоже на механизм плагинов.

Два основных понятия SPI – это service и service provider. Service – интерфейс или абстрактный класс, который объявляет API требуемого сервиса, и предоставляется основным приложением. Service provider – реализация этого API, наследник класса/интерфейса сервиса, который динамически поставляется в основное приложение библиотекой-плагином. Для одного сервиса может быть предоставлено несколько провайдеров из одной или нескольких библиотек.

На интерфейс сервиса не накладывается никаких ограничений. Провайдер же обязан реализовывать этот интерфейс, и иметь конструктор без параметров. Внутри jar-файла в директории META-INF/services лежат текстовые файлы, где имя файла – полное имя сервиса, а его строчки – полные имена провайдеров этого сервиса, которые поставляются этой библиотекой.
👍7🔥2
🤖 Пройди тест по Java

👩‍💻 Проверь свои знания. Сможешь сдать — пройдёшь на продвинутый курс "Java Developer. Professional" от OTUS по специальной цене.

За 6 месяцев обучения:
- Научишься создавать современные java-приложения
- Поймешь основы функционирования JVM (сборка мусора, byteCode)
- Освоишь приемы применения многопоточности
- Напишите выпускной проект на любую тему под наставничеством преподавателя

🎫Курс можно приобрести в рассрочку

👉 ПРОЙТИ ТЕСТ

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2🌭1🤨1
Перечислите стандартные функциональные интерфейсы

Стандартная библиотека содержит пакет java.util.function, в котором хранятся функциональные интерфейсы для большинства случаев жизни. Их можно разделить на 5 групп:

Функции
Обычная обобщенная функция – интерфейс Function<T, R>. Принимает параметр и возвращает значение другого типа. Для примитивов есть не-generic специализации – семейство интерфейсов XtoYFunction. (Здесь и далее вместо X и Y подставляются названия примитивов).

Бинарные функции – функции с двумя параметрами и возвращаемым значением. BiFunction<T, U, R>, ToXBiFunction<T, U>.

Поставщики (Suppliers)
Интерфейсы Supplier<T>, XSupplier – не принимают ничего, возвращают (поставляют) значение.

Потребители (Consumers)
Consumer<T>, XConsumer – принимают (потребляют) значение, ничего не возвращают.
Бинарный вариант, BiConsumer<T, U> и XYConsumer, потребляет два параметра.

Предикаты
Predicate<T>, XPredicate – принимают параметр, возвращают boolean. Кроме самой функции содержат дефолтные реализации логических операций.

Операторы
Унарный (UnaryOperator<T>) и бинарный (BinaryOperator<T>) – просто функция и би-функция с одинаковым типом параметров и результата. Специализации для примитивов XUnaryOperator и XBinaryOperator вдобавок содержат дефолтные реализации методов для композиции операторов.
👍16🔥32
🚀 Как решать проблемы масштабирования приложений?

⚡️ Обсудим на бесплатном открытом уроке «Проблема вертикального масштабирования и синхронизация», который пройдёт в рамках курса «Архитектура и шаблоны проектирования» от OTUS.

На эфире мы сосредоточимся на следующих аспектах:
- Предпосылки возникновения проблемы масштабирования
- Проблемы многопоточности, нежелательные состояния и синхронизация
- Обзор модели вычислений, обходящей ограничения «традиционной», и вариантов её реализации
- Обзор подходов к архитектуре приложений, преобладавших в разное время, их особенности, плюсы и недостатки

🔥 Это отличная возможность совершенно бесплатно протестировать формат обучения и задать преподавателю любые вопросы в режиме реального времени. После этого вы сможете приобрести полный курс в рассрочку на комфортных условиях.

Встречаемся 10 октября в 20:00 мск.

👉 Регистрируйтесь бесплатно прямо сейчас и ставьте событие в календарь

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍6🔥1
Что будет выведено на экран?
👍15🔥4