Библиотека джависта | Java, Spring, Maven, Hibernate
24.9K subscribers
1.86K photos
38 videos
42 files
2.64K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://yangx.top/proglibrary/9197

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
Какие у аннотации бывают таргеты?

Мета-аннотация @Target определяет, в каком контексте может применяться объявляемая аннотация. Допустимые контексты перечисляются значениями ElementType. По умолчанию, если @Target не указан, разрешены все контексты кроме TYPE_PARAMETER. Возможные таргеты:

• TYPE – Объявление класса, интерфейса, аннотации или enum-а.
• FIELD – Объявление поля (включая константы enum-ов).
• METHOD – Объявление метода.
• PARAMETER – Формальный параметр в объявлении метода.
• CONSTRUCTOR – Объявление конструктора.
• LOCAL_VARIABLE – Объявление локальной переменной.
• ANNOTATION_TYPE – Объявление аннотации. Применяется для создания мета-аннотации.
• PACKAGE – Объявление пакета (в package-info.java).
–– С Java 8 ––
• TYPE_PARAMETER – Обявление generic типа-параметра.
• TYPE_USE – Любое использование типа. Например приведение: (@NonNull String) myObject.
–– С Java 9 ––
• MODULE – Объявление модуля.

#proglib_contest
Подходит к концу эпический конкурс на самый интересный контент в телеграм-каналах Библиотеки программиста. Посты собирают всё больше откликов — спасибо за ваши старания!

У всех, кто хотел поучаствовать, остался последний шанс побороться за 20 000 ₽ в каждом из каналов: @progbook, @proglibrary, @pyproglib, @frontendproglib, @javaproglib, @dsproglib, @phpproglib, @cppproglib, @mobileproglib, @goproglib, @csharpproglib, @devopsslib, @testerlib, @hackproglib. Общий призовой фонд 280 000 ₽.

До полуночи примем последние посты — в некоторых каналах шансы на победу всё ещё высокие. Лайфхак: эти каналы нетрудно вычислить по хэштегу #proglib_contest 😉.

Напоминаем, как участвовать: пишем анонс до 700 знаков к любой актуальной айтишной статье 2020-21 годов или рецензию книги для @progbook. Отправляем получившийся текст и название канала боту @proglib_contest_bot. Чей пост в канале наберёт больше откликов, тот и выиграл.

Через три дня подведем итоги и огласим список победителей. Юридическая информация: https://proglib.io/best-post-contest.
#вопросы_с_собеседований
Расскажите про основные понятия ООП: «класс», «объект», «интерфейс».
Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).

С точки зрения программирования класс можно рассматривать как набор данных (полей, атрибутов, членов класса) и функций для работы с ними (методов).

С точки зрения структуры программы класс является сложным типом данных.

Объект (экземпляр) – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом. Каждый объект имеет конкретные значения атрибутов и методы, работающие с этими значениями на основе правил, заданных в классе.

Интерфейс – это набор методов класса, доступных для использования. Интерфейсом класса будет являться набор всех его публичных методов в совокупности с набором публичных атрибутов. По сути, интерфейс специфицирует класс, чётко определяя все возможные действия над ним.
Можно ли выбрасывать исключение generic-типа?

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

Чтобы объявить, что метод выбрасывает исключение обобщенного типа T, этот тип T должен быть объявлен расширяющим Throwable. Именно в Throwable в таком случае сотрется T при компиляции. Также в качестве типа-верхней границы можно использовать любого наследника Throwable:

class MyClass<T extends IOException> {
void foo() throws T {
// ...
}
}
This media is not supported in your browser
VIEW IN TELEGRAM
Готовы хакнуть онлайн-магазин М.ВидеоЭльдорадо и обнулить цены на топовую игровую технику и iPhone 12?📱

Участвуйте в битве Tech monsters night от М.ВидеоЭльдорадо, решите задачи конкурса лучше и быстрее других — и получите шанс обладать одним из тридцати крутых призов, оригинальным мерчем и должностью в компании.

Когда:

🔘 17.05-03.06 — Пройдите регистрацию в личном кабинете и ловите уведомления организатора в телеграм-канале.

🔘 04.06-05.06 — Tech Monsters Night: решайте задачи битвы с 22:00 до 03:00, и сразу знакомьтесь с результатами.

🔘 05.05-01.08 — Забирайте свой фирменный мерч или мощную технику. Лучший получит возможность выиграть one night offer.

Зарегистрироваться - https://i.techmn.ru/Cgbwp

До встречи на Tech Monsters Night 🌃
Кто монстр, тот знает.
Какие существуют стандартные загрузчики классов?

В JVM встроено как минимум три стандартных загрузчика:

🔘 Bootstrap – встроенная в JVM нативная реализация, родитель для всех остальных загрузчиков. Загружает часть стандартных классов java.*;
🔘 Platform – отвечает за загрузку стандартных классов Java-рантайма. До Java 9 назывался Extension и занимался загрузкой расширений. Гарантируется, что ему будут видны (но не факт что загружены непосредственно им) все стандартные классы Java SE и JDK;
🔘 System (Application) – загружает классы из classpath) конкретного приложения;

Перед тем как загрузить класс, ClassLoader проверит, не может ли это сделать его родитель. Если класс уже загружен, то загрузка не потребуется.

Иллюстрация смысла этой иерархии – загрузчики web-сервера Apache Tomcat. Прикладной код каждого web-приложения работает на своем отдельном загрузчике изолированно от других приложений. Даже один и тот же класс-singleton у каждого приложения будет собственный. Системные классы и общие библиотеки при том грузятся их родительскими загрузчиками, только один раз для сервера.

#Классы
Давно думали над переходом от разработчика к тимлиду? Тогда успейте записаться на бесплатный вебинар от GeekBrains X AGIMA и узнайте, из кого получаются хорошие тимлиды.

- Почему тимлид в AGIMA считается отдельной профессией, а не ролью;
- Какие навыки тимлида ценятся на рынке и в компании AGIMA;
- Как разработчики становятся тимлидами и как мы выстраиваем институт тимлидерства.

За 1,5 часа вы сможете послушать выступление, задать интересующие вопросы и прокачать свои скиллы. Как бонус вы получаете методические материалы и запись вебинара.

Вебинар состоится 27 мая в 19:00. Узнавайте подробности и записывайтесь здесь. Перед началом вебинара отправляется уведомление.
Опишите процесс создания экземпляра класса

Сначала класс и цепочка его предков должны быть загружены, сверху вниз. Рассмотрим ClassLoader и процесс загрузки классов в будущих постах. Здесь важно сказать, что класс загружается только один раз, при первом к нему обращении в рамках одного класслоадера.

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

Далее инстанциируется сам экземпляр. Как и с загрузкой классов, процесс выполняется для всей цепочки наследования, с самого дальнего родителя:
1. Выделяется память в куче для экземпляра, получается ссылка на этот экземпляр;
2. Выполняются инициализации нестатических полей и блоков инициализации в порядке объявления;
3. Вызывается конструктор;

Статические поля интерфейсов не инициализируются при создании объекта, а другого состояния интерфейс не имеет – это исключает вопрос порядка инициализации предков при множественном наследовании.

В процессе конструирования объекта может возникать проблема виртуального вызова в конструкторе, свойственная для многих языков. Effective Java Item 17 рекомендует не использовать переопределяемые методы в расширяемом классе. Иллюстрация неочевидного поведения в результате приведена ниже:
#вопросы_с_собеседований
Зачем нужен equals(). Чем он отличается от операции ==?
👨🏻‍💻Middle Java Developer, Serpstat, удалённо или в офис, Одесса, Киев

О компании:
🔸В команду Serpstat (международный HighLoad проект) ищем Middle Java Developer
🔸Технологии, которые используем в компании: Java, RabbitMQ, Kafka, ClickHouse, Apache Storm. Строим наш продукт по принципам SOLID, DRY, DIE, KISS, YAGNI.
🔸Serpstat — это 245 000+ пользователей, продукт представлен в 230 странах, базы данных Google для всех стран, 230 баз ключевиков, более 300 серверов, больше 250 Тб данных

Что мы ожидаем от Вас:
🔸Опыт разработки на Java от 2 лет.
🔸Знание и понимание принципов ООП.
🔸Знание, понимание и следование принципам SOLID, DRY, DIE, KISS, YAGNI.
🔸Отличные знания SQL, опыт проектирования баз данных и оптимизации запросов.
🔸Понимание работы DNS, HTTP 1/2.
🔸Опыт работы с RabbitMQ, Kafka.
🔸Знание Spring Boot, Spring Web, Spring Data.
🔸Знание Git / Maven.
🔸Знание Unix систем.

Что мы готовы предложить:
🔸Удобный график: с 8-10 до 17-19
🔸Зарплата по итогам собеседования.
🔸Возможность работать в офисе в Одессе, Киеве, или полностью удаленно
🔸Оплачиваемые больничные и отпуск
🔸Посещение профильных конференции за счет компании (мы оплачиваем 50% стоимости билета на мероприятие и проезда), а также участие в конференциях и семинарах организаторами которых является Netpeak Group
🔸Возможность обучения и развития: опыт и помощь наших сотрудников, помощь в профессиональной адаптации и обучение куратора на протяжении всего испытательного срока
🔸Карьерную лестницу и карту знаний, которые дают прозрачное понимание того, что надо сделать, чтобы перейти на новую ступеньку.

Подробности вакансии: https://career.netpeak.group/vacancy/middle-java-developer-serpstat/
Контакт: @twen_netpeak
Что такое ковариантность и контравариантность?

Формально, ковариантность/контравариантность типов – это сохранение/обращение порядка наследования для производных типов. Проще говоря, когда у ковариантных сущностей типами-параметрами являются родитель и наследник, они сами становятся как бы родителем и наследником. Контравариантные наоборот, становятся наследником и родителем.

Легче всего осознать эти понятия на примерах:
🔘 Ковариантность: List<Integer> можно присвоить в переменную типа List<? extends Number> (как будто он наследник List<Number>).
🔘 Контравариантность: в качестве параметра метода List<Number>#sort типа Comparator<? super Number> может быть передан Comparator<Object> (как будто он родитель Comparator<Number>)

Отношение типов «можно присвоить» – не совсем наследование, такие типы называются совместимыми (отношение «is a»).

Существует еще одно связанное понятие – инвариантность. Инвариантность – это отсутствие свойств ковариантности и контрвариантности. Дженерики без вайлдкардов инвариантны: List<Number> нельзя положить ни в переменную типа List<Double>, ни в List<Object>.

Массивы ковариантны: в переменную Object[] можно присвоить значение типа String[].

Переопределение методов начиная с Java 5 ковариантно относительно типа результата и типов исключений.

#Язык
#Дженерики
Метод equals() - определяет отношение эквивалентности объектов.

При сравнении объектов с помощью == сравнение происходит лишь между ссылками. При сравнении по переопределённому разработчиком equals() - по внутреннему состоянию объектов.
От написания кода до релиза — DevOps-инженер все держит под контролем! Поэтому спрос на этих специалистов всего лишь за 2 года вырос на 70%

Хочешь освоить по-настоящему востребованную профессию? Образовательная платформа GeekBrains открывает набор на Факультет DevOps

Даже если вы никогда не работали в IT, вы получите востребованную и высокооплачиваемую специальность. Сможете использовать методологии Agile и Scrum, оптимизировать CI/CD и работать с облачными технологиями.

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

Первый платеж за обучение можно совершить через 6 месяцев. Скорее регистрируйтесь, ведь сейчас на курс действует скидка 35% → https://gb.ru/link/p_7ItX
Пришло время подвести итоги конкурса на лучший контент #proglib_contest. Искренне благодарим всех, кто принял активное участие, без вашей поддержки конкурс бы не получился.

Победителем канала Библиотека джависта становится автор поста — барабанная дробь 🥁https://yangx.top/javaproglib/2513.

Победитель определен по количеству лайков под постом среди других конкурсных сообщений. За победный пост автор получает 20 000 ₽. В ближайшее время мы свяжемся с победителем и отправим приз — оставайтесь на связи.

Спасибо, что читаете нас!
Разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток. Класс PushbackInputStream представляет механизм «заглянуть» во входной поток и увидеть, что оттуда поступит в следующий момент, не извлекая информации.

У класса есть дополнительный метод unread().
Вакансия: Java – разработчик, middle – senior
Компания: #Usetech
Локация: офисы Москва, Ростов-на-Дону, Барнаул, Томск или удаленная работа.
ЗП: от 200 до 300 K NET
Контакты: [email protected]
@SofiaGardash

Откликнуться

C 2006 года Usetech осуществляет полный спектр работ в области заказной разработки ПО для своих Заказчиков в отраслях: ритейл, финансы, телеком, ИТ и государственном секторе.

На протяжении последних лет компания активно участвует в создании цифровой экосистемы страны. Нашими прорывными решениями пользуются миллионы людей по всему миру, а мировые тренды находят отражение в разработанном нами ПО (Ml, Al, Blockchain, Big Data, нейросети, роботизированные сервисы и многое другое).

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

Задачи:
• Выполнение технической декомпозиции задач;
• Оценка трудозатрат по тикетам;
• Наставничество новых / начинающих разработчиков в команде;
• Реализация и ревью ключевой функциональности в системе;
• Участие в планировании и высокоуровневой оценке новых фич;
• Документирование своего кода, участие в разработке технических документов для сопровождения и сдачи системы;
• Разработка системы, построенную на микросервисной архитектуре;
• Разработка новых сервисов, рефакторинг и развитие существующих;
• Доработка существующую функциональность;
• Работать в команде по методологии Scrum.

Мы ожидаем:
• Высшее техническое образование;
• Опыт разработки 3-хзвенных приложений от 5 лет;
• Отличное знание и опыт программирования на языке Java (JavaSE 8-11, Spring);
• Умение и опыт планирования, декомпозиции, распределения и контроля работ разработки и развертывания ППО;
• Умение и опыт проектирования программного обеспечения;
• Хорошее знание и опыт работы со средствами сборки;
• Знание и опыт работы: со средствами непрерывной интеграции, с системой отслеживания ошибок, юнит-тестирования и оценки покрытия тестами, использования технологий интеграции приложений;
• Глубокие знания и опыт коммерческой работы со Spring Framework, JDBC, Spring JDBC Templates/MyBatis;
• Отличные знания SQL: оптимизация запросов, проектирование модели данных для соответствия требованиям по производительности.

Мы предлагаем:
• Работу в стабильной и активно развивающейся IT-компании, где нет бюрократии, и все сотрудники знают друг друга в лицо;
• Интересные и сложные проектные задачи на основе современного стека технологий;
• Социальный пакет (полис медицинского страхования (ДМС), оплата обучения);
• Регулярные внутренние семинары, посвященные новым технологиям и самым актуальным темам в области разработки, аналитики и тестирования;
• Прозрачная система профессионального роста, ежегодный пересмотр заработной платы в сторону увеличения.
• Гибкое начало рабочего дня (старт работы с 08.00 – 12.00);
• Свободный стиль одежды.