Java Guru 🤓
13.2K subscribers
891 photos
16 videos
760 links
Канал с вопросами и задачами с собеседований!

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

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

Мы на бирже: telega.in/channels/javatasks/card?r=lcDuijdm
Download Telegram
Что нужно знать для работы с PostgreSQL?

Расскажет опытный эксперт на бесплатном практическом уроке «MVCC, vacuum и autovacuum в PostgreSQL» от OTUS

На вебинаре мы разберём как работают MVCC, vacuum и autovacuum в postgres

Расскажем как работают мультиверсионирование и механизмы оптимизации в PostgreSQL

Встречаемся 12 февраля в 20:00 мск в рамках курса «Базы данных». Доступна рассрочка на обучение!

👉 Регистрация
https://otus.pw/KOsX/?erid=LjN8KYBn1
5👍2😁1
От чего может случиться NoSuchMethodError?

Как очевидно из названия, программа пытается вызвать метод, которого не существует. В большинстве случаев это приводит к ошибке еще на этапе компиляции. Но в некоторых ситуациях о проблеме становится известно только во время выполнения, и тогда выбрасывается это исключение.

Вариантов таких ситуаций два. Либо проект был изменен и частично перекомпилирован; либо программа несовместима с внешней зависимостью: например неправильная версия jar-библиотеки в classpath.

Исключение NoSuchMethodError наследуется от LinkageError. Все такие ошибки – признаки несовместимых изменений после компиляции класса.

Не следует путать эту ошибку с NoSuchMethodException – исключением, которое случается при попытке вызвать несуществующий метод с помощью Reflection API. Важное отличие в том, что это не Error, его можно ловить и обрабатывать.
👍13🥰3🔥2🎉1
Отус приглашает 15 февраля в 20:00 мск на бесплатный вебинар «Роль Apache Kafka в логировании».

Вебинар является частью продвинутого онлайн-курса "Observability: мониторинг, логирование, трейсинг".

➡️ Регистрация на вебинар: https://vk.cc/cusU94

На вебинаре мы разберём:
роль брокера в Kafka;
как Kafka интегрируется в общую систему сбора данных;
индексы в Kafka;
взаимодействие с общим стеком логирования.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
В чём разница между интерпретатором, AOT и JIT-компилятором?

Интерпретация – простое последовательное воспроизведение кода программы, команда за командой.

AOT-компиляция (ahead-of-time, статическая) – процесс превращения текста на языке программирования в нативный код на машинном языке. Так работают языки вроде C++. В современных JDK можно получить настоящий ahead-of-time скомпилированный машинный код с помощью утилиты jaotc.

JIT-компиляция (just-in-time, динамическая) – «умная» интерпретация. Среда выполнения анализирует исполняемый код, оптимизируя часто вызываемые участки. Таким способом программа работает значительно быстрее, и сохраняет при этом преимущества платформо-независимости оригинального кода. Именно с JIT-компиляцией связана необходимость «прогрева» программ перед тестированием производительности.

Эти термины относятся не только к JVM, но и ко множеству других языков программирования. Конкретно в Java байткод – интерпретируемый. Но в JVM по умолчанию работает JIT-компилятор. А процесс компиляции Java-кода в байткод можно назвать AOT-компиляцией.

Для взаимодействия с JIT-компилятором из кода в JDK поставляется класс java.lang.Compiler. Его методом disable() можно отключить JIT и перевести программу в режим простой интерпретации. Сейчас этот класс объявлен устаревшим и готовится к удалению.

Более красивый способ влиять на компилятор – передавать его настройки параметрами JVM. Параметр -Djava.compiler=NONE также переключит программу с JIT на интерпретатор. В теории, через этот же параметр можно подключить другой JIT-компилятор, альтернативный встроенному в JVM.
👍211
One Day Offer для Java-разработчиков

Приходите к нам, чтобы развивать успешный коммерческий продукт — HR-платформу Сбера!

«Пульс» автоматизирует весь HR-цикл компании и полезен каждому сотруднику, а не только HR-специалистам. Продукт разработан для компаний со штатом от 500 сотрудников. В работе мы используем Java/Kotlin (JDK 11/17), Spring Boot, Kafka, PostgreSQL, Docker, K8s и др.

Какие задачи будут в вашем планере:

•проектировать и разрабатывать компоненты SaaS-платформы в рамках микросервисной архитектуры

•разрабатывать unit и end-to-end тесты, участвовать в code review и фазах релизного процесса

•проводить анализ по улучшению производительности сервисов

Масштабные проекты и работа в крупнейшем IT-сообществе ждёт вас. Регистрируйтесь на One Day Offer
👍8🔥2🥰2
Чем отличается interface от @⁠interface?

Среди интерфейсов выделяется особая группа, которая не объявляет никаких методов. Пример такого интерфейса – Serializable. Такие интерфейсы добавляют классу некую семантику, которая позже используется либо с помощью рефлексии (и instanceof), либо вообще не программно, а как информация для разработчиков и инструментов разработки. Это маркерные интерфейсы. Маркерный интерфейс представляет метаинформацию класса.

Начиная с Java 1.5 в языке появился новый вид типов – аннотации. Они берут на себя и расширяют возможности маркерного интерфейса:
1. Можно применять аннотацию не только к классу или интерфейсу, но почти к чему угодно: к пакетам, к методам, их параметрам, переменным. Полный список представлен в перечислении ElementType;
2. Аннотация может нести данные в своих элементах
3. Аннотация может не присутствовать в рантайме, или даже остаться только в исходнике, не попав в байткод вовсе. Определяется ее RetentionPolicy;
4. Можно сделать аннотацию не наследуемой, просто не помечая ее
@Inherited;
5. И конечно же, синтаксис. Примененная аннотация с первого взгляда отличается от настоящих интерфейсов.

Joshua Block в главе 37 Effective Java выделяет два преимущества маркерных интерфейсов перед аннотациями на этапе компиляции:
1. Можно требовать использование только маркированного параметра, так как маркерный интерфейс – это еще и тип;
2. Можно сузить применяемость маркера к только определенным типам, сделав интерфейс их наследником.

Возвращаясь к вопросу, ключевое слово
@interface объявляет аннотацию, interface – интерфейс.

В результате компиляции в .class-файле аннотация превращается в интерфейс-наследник java.lang.annotation.Annotation, помеченный флагом ACC_ANNOTATION. Элементы превращаются в абстрактные методы. Этим объясняется синтаксис объявления. Специфичные для аннотаций атрибуты описаны в JVMS 4.7.16-4.7.22.

К слову, конструкции вида
@something в javadoc называются тэгами. Они выглядят похоже на аннотации, также представляют метаинформацию для документации, но технически не имеют с ними ничего общего.
🔥9👍3🎉2
Программируй Event Sourcing системы и получи преимущество на рынке!

Уникальный для русскоязычного сегмента курс от преподавателя Спб НИУ ИТМО и разработчика ПО Андрея Суховицкого

Целишься на позиции senior или architect? Хочешь знать больше, чем твои коллеги? Этот курс для тебя!

На курсе ты:
Разберешься в event-driven системах
Узнаешь Event sourcing, паттерн CQRS лучше, чем 99.9% разработчиков
Пройдешь путь создания Kafka, узнаешь best practice для RabbitMQ и как масштабировать свои системы
Твердо поймешь основы Domain-driven design
Глубоко залезешь в паттерн Saga и реализуешь распределенную транзакцию
Будешь уверен в себе на system design интервью

Твоими менторами станут ребята из Амазон, Револют, Яндекс и Озон.

❗️Старт курса - 15 февраля, лекции и задания доступны уже сейчас! ❗️
Промокод GURU на 10% до 15 февраля

Переходи по ссылке и начинай учиться!
🔥6👍3🎉2
Что выведет следующий код?
👍10🔥2
👍14🤯9😐3🔥2🥴1
♨️ Анализировать множество показателей и не перегружать приложение?
С Java Flight Recorder – это легко.


JFR:
- Регистрирует множество событий внутри виртуальной машины Java
- Не ухудшает производительность
- Помогает детально разобраться в причинах сбоев и ошибок

Хотите освоить?

Приглашаем java-разработчиков и тестировщиков
на бесплатный онлайн-урок «Обзор инструмента Java Flight Recorder»!

Вы узнаете:
что такое Java Flight Recorder и для каких целей используется
как запустить и остановить JFR
как настроить интересующий вас профиль по событиям JVM
как прочитать готовый журнал с помощью Java Mission Control

Ведущий – Александр Царёв, техлид в Сбере.

После открытого урока вы сможете записаться на курс для продвинутых разработчиков «Java Developer. Advanced».

Событие начнётся 14 февраля в 20:00 МСК
Участие бесплатное

🤝 Зарегистрироваться!

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2🎉21
Для чего используются аннотации?

Удобно рассмотреть случаи применения аннотаций с точки зрения возможных значений их свойства RetentionPolicy:

SOURCE – аннотация присутствует только в исходном коде, но не вовлечена в компиляцию. Можно разделить их на две категории:

Первая – аннотации для программиста, а не для программы. Это всевозможные маркеры. Они добавляют аннотируемым элементам некоторую специальную семантику. Более формализованный вариант документации. Примеры –
@Immutable и @ThreadSafe из Hibernate.

Вторая категория – инструкции для инструментов разработки. Примеры этой категории,
@SuppressWarnings и @Override могут влиять на предупреждения и ошибки компиляции. IntelliJ IDEA умеет понимать @Nullable и @NonNull из Spring Framework, и предупреждать о возможных NullPointerException.

CLASS – самое экзотическое, но при том стандартное значение. Аннотация попадает в байткод .class-файла, но игнорируется загрузчиком классов. В результате такая аннотация недоступна для рефлекшна. Используется для сторонних инструментов, обрабатывающих байткод, например для обфускаторов.

RUNTIME – самое ходовое значение. Цель снабжается метаинформацией, доступной во время выполнения программы. Сама по себе аннотация всё так же не добавляет нового поведения. Для практической пользы runtime-аннотации в программе должен быть исполнен некоторый код процессинга, который прочитает метаинформацию инструментами Reflection API. Такой механизм широко используется во множестве популярных фреймворков: Spring, Hibernate, Jackson.
👍13🔥32🎉2
Можно ли наследовать аннотацию?

Можно понять этот вопрос по-разному. Если имеется в виду, передается ли аннотация класса-родителя классу-наследнику, ответ – по умолчанию нет. Но наследование можно включить, если на объявлении аннотации поставить мета-аннотацию @Inherited. Это работает только для классов, переопределенные методы нужно аннотировать заново.

Другой возможный смысл вопроса – наследование самих типов-аннотаций. Аннотация, как класс или интерфейс представляется в системе ссылочным типом, она тоже компилируется в .class-файл. Вы можете создать переменную с типом, скажем, java.lang.Override.

Но в отличие от других ссылочных типов, объявление аннотации (
@interface) не может иметь секций extends или implements. Это ограничение добавлено просто чтобы не усложнять систему типов. В скомпилированном коде все типы-аннотации – это интерфейсы, унаследованные от Annotation.
👍135🔥4👏1
♨️ Готовимся к собеседованию на Java разработчика Junior+/ Middle: проверьте свои знания

На данном мероприятии мы подробно разберем, какие вопросы могут возникнуть на собеседовании на позицию Java Middle Developer.
Урок будет полезен каждому, кто желает оценить свой уровень понимания Java.

В результате посещения вебинара:
- Вы сможете уверенно ответить на большинство вопросов, которые могут возникнуть на интервью для уровня Java Middle Developer;
- будете осведомлены о подводных камнях, связанных с ответами на эти вопросы.

После открытого урока вы сможете записаться на курс для продвинутых разработчиков «Java Developer. Professional» по специальной цене.

Событие пройдет 20 февраля в 20:00 МСК
Участие бесплатное

➡️ Зарегистрироваться!

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍2🔥2👏1
Можно ли добавить одному элементу несколько одинаковых аннотаций?

По умолчанию нельзя. До Java 8 нужно было создавать дополнительную аннотацию-контейнер, в ней в виде проперти объявлять массив интересующих аннотаций. При применении набор аннотаций нужно было оборачивать в этот контейнер (см. на картинке).

Начиная с Java 8 в стандартную библиотеку добавлена мета-аннотация
@Repeatable.
Механизм ее действия такой же, как раньше: помечая ей интересующую аннотацию, необходимо указать параметром
@Repeatable аннотацию-контейнер. Нововведение заключается в синтаксисе использования: теперь набор аннотаций оборачивается в контейнер неявно.

Со стороны Reflection при чтении мета-информации тоже появилась возможность не оперировать контейнером явно – метод getAnnotationsByType при необходимости найдет и развернет этот контейнер.
9👍6🔥2
Начал изучать Java?☕️

Приходи на бесплатный урок «Основы объектно-ориентированного программирования в Java» от OTUS.

На вебинаре обсудим основы ООП, лежащего в основе языка Java, посмотрим как его использовать при написании кода, и какие преимущества он предоставляет.

Урок будет полезен тем, кто хочет:
— Начать изучать Java с нуля.
— Не знает с какой стороны подойти к теме ООП (не только в языке Java).

Занятие пройдёт 22 февраля в 20:00 мск и будет приурочено к старту курса «Java-разработчик». Программа обновлена и полностью отвечает современным требованиям рынка.

➡️ Для бесплатного участия и получения записи регистрируйтесь прямо сейчас: регистрация

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3
Что выведет следующий код?
👍63🔥2👏1
💗 Новый проект оказался сложнее, чем вы ожидали. Всё равно попробуете с ним справиться, спросите совета у ChatGPT или отдадите более опытному коллеге?

Нашли тест от Карьерного маркетплейса hh.ru для тех, кто в сложных отношениях с работой. Ответьте всего на пять вопросов и узнайте, как вам развиваться профессионально и строить карьеру без лишних нервов.

В конце теста вас ждёт скидка 14% на карьерную консультацию с 12 по 19 февраля. Не забудьте забрать.

Реклама. ООО «Хэдхантер»‎, 129085, г. Москва, ул. Годовикова, д.9, стр.10, ОГРН 1067761906805. erid: 2VtzqwZ7CLR
Подробнее об условиях акции.
👍4🔥2
Как используется @⁠Deprecated?

Этой аннотацией помечают код, который устарел и не должен быть более использован. Классы, которые используют или переопределяют @Deprecated элементы, будут компилироваться с warning-ом.

Имеет retention RUNTIME, что значит, что фреймворки могут динамически проверять наличие аннотации на элементе с помощью Reflection API.

Начиная с Java 9 у этой аннотации появились опциональные параметры – строка since и булево значение forRemoval. В since указывается версия вашего приложения, начиная с которой элемент считается устаревшим. Значение true в forRemoval предупреждает, что со следующей мажорной версии этот элемент будет удален. Такое нововведение связано с изменением политики устаревания – с Java 9 и устаревшие элементы самой JDK тоже могут удаляться в будущих версиях.

Обычно, когда элемент помечают устаревшим, причины устаревания и дальнейшие рекомендации указывают в его Javadoc-документации под тегом
@deprecated.
👍15🔥41
This media is not supported in your browser
VIEW IN TELEGRAM
Приглашаем на Infra Meetup #3 — митап про надежность от Яндекс Такси и Техплатформы Екома и Райдтеха

На митапе поделимся тремя докладами об инструментах надежности в Такси, платформе биллинга Екома и Райдтеха и возможностях фреймворка userver для поддержания отказоустойчивости. В конце митапа участников ждет нетворкинг и экскурсия по питерскому офису.

Формат: офлайн или онлайн
Место встречи: Санкт-Петербург, БЦ «Бенуа»
Дата и время: 29 февраля, 18:00

Бесплатно. Количество офлайн мест ограничено. Регистрация обязательна

Подробнее

Реклама. ООО "Яндекс.Такси", ИНН: 7704340310
👍7🔥2🥴1
Что такое Type Erasure?

Компилятор удаляет из байткода класс-файла информацию о типах-дженериках. Этот процесс и называется стирание типов (type erasure). Он появился в Java 5 вместе с самими дженериками. Такое решение позволило сохранить обратную совместимость без перекомпилляции кода Java 4.

Стирание состоит из трех действий:
🔘 Если параметры ограничены (bounded), вместо типа-параметра в местах использования подставляется верхняя граница, иначе Object;
🔘 В местах присвоения значения типа-параметра в переменную обычного типа добавляется каст к этому типу;
🔘 Генерируются bridge-методы.

Информация о типах стирается только из методов и полей, но остается в метаинформации самого класса. Получить эту информацию в рантайме можно с помощью рефлекшна, методом Field#getGenericType.

Тип со стертой информацией о дженериках называется «Non-reifiable».

Стирание типов позволяет не создавать при применении дженериков новые классы, в отличие от, например, шаблонов C++.
👍18🔥2