Удобная подсветка покрытия кода тестами в Merge Request GitLab
Основным средством для командной работы с репозиторием компании, в которой я работаю, является Gitlab. На первый взгляд, он хорош: и бесплатной версии хватает сполна, и CI/CD - пайплайн имеется, и хранить артефакты тоже можно (долой Nexus). Однако, и у GitLab есть свои минусы.
Так, например, разработчики до сих пор не смогли реализовать визуализацию покрытия тестов. Да, она у них есть, но для её реализации нужно сгенерировать и загрузить в GitLab отчет о покрытии в устаревшем формате Cobertura, а не в актуальном Jacoco. Основная же проблема в том, что Cobertura plugin последний раз обновлялся в далеком 2015 году.
https://habr.com/ru/articles/758066/
👉@BookJava
Основным средством для командной работы с репозиторием компании, в которой я работаю, является Gitlab. На первый взгляд, он хорош: и бесплатной версии хватает сполна, и CI/CD - пайплайн имеется, и хранить артефакты тоже можно (долой Nexus). Однако, и у GitLab есть свои минусы.
Так, например, разработчики до сих пор не смогли реализовать визуализацию покрытия тестов. Да, она у них есть, но для её реализации нужно сгенерировать и загрузить в GitLab отчет о покрытии в устаревшем формате Cobertura, а не в актуальном Jacoco. Основная же проблема в том, что Cobertura plugin последний раз обновлялся в далеком 2015 году.
https://habr.com/ru/articles/758066/
👉@BookJava
👍2
JavaDoc: добро или необходимое зло?
Привет! Меня зовут Андрей Костров, я старший разработчик в X5 Tech.
При создании проекта А мы вложили много сил в JavaDoc. Многим казалось это излишним. Затем проект А заморозили и начали новый – проект Б. При этом переиспользовали много кода из проекта А, вместе с JavaDoc. Рассказ о том, принёс ли JavaDoc пользу (спойлер: да). А также немного слов о том, где усилия по JavaDoc всё-таки были избыточны.
https://habr.com/ru/companies/X5Tech/articles/752338/
👉@BookJava
Привет! Меня зовут Андрей Костров, я старший разработчик в X5 Tech.
При создании проекта А мы вложили много сил в JavaDoc. Многим казалось это излишним. Затем проект А заморозили и начали новый – проект Б. При этом переиспользовали много кода из проекта А, вместе с JavaDoc. Рассказ о том, принёс ли JavaDoc пользу (спойлер: да). А также немного слов о том, где усилия по JavaDoc всё-таки были избыточны.
https://habr.com/ru/companies/X5Tech/articles/752338/
👉@BookJava
👍3
Forwarded from Книги по Java | Books Java 📚
12992683-dzone-refcard318-java13.pdf
1 MB
Подборка шпаргалок по Java
Основы синтаксиса;
Особенности Java;
Горячие клавиши в IntelliJ IDEA;
Лаконичное руководство по основам языка.
👉 @java_360
Основы синтаксиса;
Особенности Java;
Горячие клавиши в IntelliJ IDEA;
Лаконичное руководство по основам языка.
👉 @java_360
👍7
Media is too big
VIEW IN TELEGRAM
Вопросы с senior java интервью
Тайм-коды:
0:00 - Вступление
0:25 - Эти вопросы реально спрашивают
0:52 - Как устроен ролик
1:53 - Примитивы и доступ по значению (доступ всегда по значению)
3:53 - Пример с Boolean, который был несколько раз
4:58 - Хэш мапа и equals
6:00 - Как сломать мапу мутабельным ключом
7:30 - Плохое распределение хэшей
11:36 - Фреймворк коллекций (Collection framework)
12:30 - Устройство листов, почему linkedlist не используют в проде
13:50 - Иерархия исключений
14:48 - Optional и хитрости работы с ними
16:50 - Thread-local и то как его использовать
17:50 - Наследуемый Thread-local
19:20 - Стримы и примитивные стримы
22:25 - Хитрости try-catch-finally
23:38 - Try-with resource, Autoclosable
25:15 - Conditionalы, как создать свой стартер, логика конфигураций
28:05 - Жизненный цикл бинов, логика создания объектов
30:14 - Докер и зачем он нужен
источник
👉@BookJava
Тайм-коды:
0:00 - Вступление
0:25 - Эти вопросы реально спрашивают
0:52 - Как устроен ролик
1:53 - Примитивы и доступ по значению (доступ всегда по значению)
3:53 - Пример с Boolean, который был несколько раз
4:58 - Хэш мапа и equals
6:00 - Как сломать мапу мутабельным ключом
7:30 - Плохое распределение хэшей
11:36 - Фреймворк коллекций (Collection framework)
12:30 - Устройство листов, почему linkedlist не используют в проде
13:50 - Иерархия исключений
14:48 - Optional и хитрости работы с ними
16:50 - Thread-local и то как его использовать
17:50 - Наследуемый Thread-local
19:20 - Стримы и примитивные стримы
22:25 - Хитрости try-catch-finally
23:38 - Try-with resource, Autoclosable
25:15 - Conditionalы, как создать свой стартер, логика конфигураций
28:05 - Жизненный цикл бинов, логика создания объектов
30:14 - Докер и зачем он нужен
источник
👉@BookJava
👍5🤔2❤1👎1
TestNG или JUnit – что выбрать?
Ответ на такого рода вопросы всегда зависит от дополнительных деталей контекста. Не просто так TestNG и JUnit – два самых популярных фреймворка для unit-тестирования, у каждого есть свои плюсы.
JUnit – золотой стандарт. Это библиотека из семейства xUnit, которое во многом сформировало unit-тестирование таким, каким мы знаем его сегодня. И до сих пор, оставаясь самой популярной библиотекой для тестирования, она продолжает активно развиваться.
Фреймворк TestNG был вдохновлен JUnit, но добавляет небольшой набор дополнительных фич. Некоторые из указанных на сайте возможностей на самом деле доступны и в JUnit: например data-driven тесты, или параллельное выполнение. Подробное сравнение JUnit 4 и TestNG доступно в статье от mkyong.
Стоит отметить, что современный JUnit 5 имеет достаточно заметные отличия от JUnit 4, их можно рассматривать как разные фреймворки. Подробнее об отличиях читайте на хабре.
👉@BookJava
Ответ на такого рода вопросы всегда зависит от дополнительных деталей контекста. Не просто так TestNG и JUnit – два самых популярных фреймворка для unit-тестирования, у каждого есть свои плюсы.
JUnit – золотой стандарт. Это библиотека из семейства xUnit, которое во многом сформировало unit-тестирование таким, каким мы знаем его сегодня. И до сих пор, оставаясь самой популярной библиотекой для тестирования, она продолжает активно развиваться.
Фреймворк TestNG был вдохновлен JUnit, но добавляет небольшой набор дополнительных фич. Некоторые из указанных на сайте возможностей на самом деле доступны и в JUnit: например data-driven тесты, или параллельное выполнение. Подробное сравнение JUnit 4 и TestNG доступно в статье от mkyong.
Стоит отметить, что современный JUnit 5 имеет достаточно заметные отличия от JUnit 4, их можно рассматривать как разные фреймворки. Подробнее об отличиях читайте на хабре.
👉@BookJava
👍3
Как работает jvm - Архитектура JVM
Развитие виртуальных технологий привело к созданию jvm. JVM решает проблему переносимости скомпилированного кода между системами, возникшую по сравнению с предыдущими языками программирования, такими как c/c++. JDK преобразует программный код в байткод, что обеспечивает переносимость и независимый запуск независимо от операционной системы.
https://awstip.com/how-jvm-works-jvm-architecture-4f5b15946e6d
👉@BookJava
Развитие виртуальных технологий привело к созданию jvm. JVM решает проблему переносимости скомпилированного кода между системами, возникшую по сравнению с предыдущими языками программирования, такими как c/c++. JDK преобразует программный код в байткод, что обеспечивает переносимость и независимый запуск независимо от операционной системы.
https://awstip.com/how-jvm-works-jvm-architecture-4f5b15946e6d
👉@BookJava
👍4
Исчерпывающее руководство по одномерным массивам в Java
Для хранения данных, используемых при работе программы, применяются переменные того или иного типа. Например, если требуется сохранить имя игрока, то создается переменная String name, если целочисленное значение, то int number и т. д. Когда таких значений немного или их количество заранее известно, то для них приемлемо использовать отдельные переменные.
Но что делать, когда в программе задействовано не одно, а 10 чисел, или их количество становится известно только на этапе запуска приложения, когда пользователь вводит его с клавиатуры? Или в какой-то игре может участвовать разное количество игроков, устанавливаемое при ее старте. В таких ситуациях отдельными переменными уже не обойтись, т. к. их точное количество будет невозможно определить. Да и, если все же попытаться это сделать, код станет громоздким и не универсальным, а работа с ним будет крайне ограниченной из-за невозможности использования цикла для автоматизированной обработки данных.
https://habr.com/ru/articles/753638/
👉@BookJava
Для хранения данных, используемых при работе программы, применяются переменные того или иного типа. Например, если требуется сохранить имя игрока, то создается переменная String name, если целочисленное значение, то int number и т. д. Когда таких значений немного или их количество заранее известно, то для них приемлемо использовать отдельные переменные.
Но что делать, когда в программе задействовано не одно, а 10 чисел, или их количество становится известно только на этапе запуска приложения, когда пользователь вводит его с клавиатуры? Или в какой-то игре может участвовать разное количество игроков, устанавливаемое при ее старте. В таких ситуациях отдельными переменными уже не обойтись, т. к. их точное количество будет невозможно определить. Да и, если все же попытаться это сделать, код станет громоздким и не универсальным, а работа с ним будет крайне ограниченной из-за невозможности использования цикла для автоматизированной обработки данных.
https://habr.com/ru/articles/753638/
👉@BookJava
👍2
Mastering the Main Thread in Java
Язык Java, известный своими мощными возможностями многопоточности, основан на концепции потоков, выполняющихся параллельно. В основе каждого Java-приложения лежит главный поток. Этот поток организует точку входа в программу, инициирует другие потоки и управляет жизненным циклом приложения. В этом учебном пособии по программированию мы погрузимся в мир главного потока, рассмотрим его роль, нюансы и лучшие практики оптимального управления потоками.
https://www.developer.com/java/java-main-thread/
👉@BookJava
Язык Java, известный своими мощными возможностями многопоточности, основан на концепции потоков, выполняющихся параллельно. В основе каждого Java-приложения лежит главный поток. Этот поток организует точку входа в программу, инициирует другие потоки и управляет жизненным циклом приложения. В этом учебном пособии по программированию мы погрузимся в мир главного потока, рассмотрим его роль, нюансы и лучшие практики оптимального управления потоками.
https://www.developer.com/java/java-main-thread/
👉@BookJava
👍5
Реквием по «Расскажи, как работает HashMap?»
За долгие годы коммерческого опыта я прошел огромное количество технических собеседований, посвященных Java и друзьям. Менялись интервьюеры и язык повествования, глубина вопросов и количество собеседований, но что‑то оставалось неизменным —
«разогревочный» вопрос «расскажи, как работает HashMap?»
Давайте разберемся, почему это не только бесполезный, но и вредный вопрос, который противопоказано задавать в большинстве собеседований на позицию Java-разработчика.
https://habr.com/ru/articles/757510/
👉@BookJava
За долгие годы коммерческого опыта я прошел огромное количество технических собеседований, посвященных Java и друзьям. Менялись интервьюеры и язык повествования, глубина вопросов и количество собеседований, но что‑то оставалось неизменным —
«разогревочный» вопрос «расскажи, как работает HashMap?»
Давайте разберемся, почему это не только бесполезный, но и вредный вопрос, который противопоказано задавать в большинстве собеседований на позицию Java-разработчика.
https://habr.com/ru/articles/757510/
👉@BookJava
👍6
Media is too big
VIEW IN TELEGRAM
Разрешаем фронту подписаться на бэкенд. Server Sent Events на Java Spring Boot.
Простой способ избежать постоянного опроса сервера. Событийный способ работы.
источник
👉@BookJava
Простой способ избежать постоянного опроса сервера. Событийный способ работы.
источник
👉@BookJava
👍5
Разработка децентрализованных приложений на Spring Boot: инструменты Web3 Tech
Привет! Меня зовут Даниил, я разработчик в Web3 Tech. Недавно в JVM-инструментарии для нашей основной платформы «Конфидент» состоялся новый релиз, в который вошли библиотеки клиента для взаимодействия с нодой и Spring Boot стартеры. Далее в посте я расскажу об этих библиотеках, которые помогут вам комфортно и эффективно создавать на JVM-языках программирования полноценные приложения, взаимодействующие со смарт-контрактами нашей платформы.
https://habr.com/ru/companies/web3_tech/articles/768310/
👉@BookJava
Привет! Меня зовут Даниил, я разработчик в Web3 Tech. Недавно в JVM-инструментарии для нашей основной платформы «Конфидент» состоялся новый релиз, в который вошли библиотеки клиента для взаимодействия с нодой и Spring Boot стартеры. Далее в посте я расскажу об этих библиотеках, которые помогут вам комфортно и эффективно создавать на JVM-языках программирования полноценные приложения, взаимодействующие со смарт-контрактами нашей платформы.
https://habr.com/ru/companies/web3_tech/articles/768310/
👉@BookJava
❤1👍1
Я хотел сломать Java и я это сделал
На написание этой статьи, меня натолкнул разбор результата изменения полей объекта, лежащего в HashSet. Я развил идею и привнёс альтернативную математику в Java.
Ломаем
В Java существуют примитивные типы и их объектные версии. Для оптимизации JVM заранее создаёт и кеширует Boolean, Byte, Short и часть диапазона Integer, чтобы вместо создания нового объекта использовать существующий в кеше.
Взглянем на Integer.java
https://habr.com/ru/articles/767114/
👉@BookJava
На написание этой статьи, меня натолкнул разбор результата изменения полей объекта, лежащего в HashSet. Я развил идею и привнёс альтернативную математику в Java.
Ломаем
В Java существуют примитивные типы и их объектные версии. Для оптимизации JVM заранее создаёт и кеширует Boolean, Byte, Short и часть диапазона Integer, чтобы вместо создания нового объекта использовать существующий в кеше.
Взглянем на Integer.java
public final class Integer extends Number
implements Comparable<Integer>, Constable, ConstantDesc {
private final int value;
@IntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
}
https://habr.com/ru/articles/767114/
👉@BookJava
👍3❤1
Что такое статическое и динамическое связывание?
Присоединение вызова метода к телу метода называется связыванием. Если связывание проводится компилятором (компоновщиком) перед запуском программы, то оно называется статическим или ранним связыванием (early binding).
В свою очередь, позднее связывание (late binding) это связывание, проводимое непосредственно во время выполнения программы, в зависимости от типа объекта. Позднее связывание также называют динамическим (dynamic) или связыванием на стадии выполнения (runtime binding). В языках, реализующих позднее связывание, должен существовать механизм определения фактического типа объекта во время работы программы, для вызова подходящего метода. Иначе говоря, компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода. Механизм позднего связывания зависит от конкретного языка, но нетрудно предположить, что для его реализации в объекты должна включаться какая-то дополнительная информация.
Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).
👉@BookJava
Присоединение вызова метода к телу метода называется связыванием. Если связывание проводится компилятором (компоновщиком) перед запуском программы, то оно называется статическим или ранним связыванием (early binding).
В свою очередь, позднее связывание (late binding) это связывание, проводимое непосредственно во время выполнения программы, в зависимости от типа объекта. Позднее связывание также называют динамическим (dynamic) или связыванием на стадии выполнения (runtime binding). В языках, реализующих позднее связывание, должен существовать механизм определения фактического типа объекта во время работы программы, для вызова подходящего метода. Иначе говоря, компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода. Механизм позднего связывания зависит от конкретного языка, но нетрудно предположить, что для его реализации в объекты должна включаться какая-то дополнительная информация.
Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).
👉@BookJava
👍5
🚀 Изучай Symfony Framework для работы над масштабными PHP-проектами!
Записывайся на продвинутый онлайн-курс Symfony Framework от Отус (старт 21 ноября 2023 года) и получи возможность:
✅ развивать идеи Java Spring в PHP-экосистеме
✅ участвовать в создании enterprise-проектов со сложной бизнес-логикой
✅ претендовать на высокооплачиваемые вакансии middle+
Ответь на вопросы вступительного теста за 30 минут и проверь, насколько ты готов к освоению Symfony Framework: https://clck.ru/369kTP
Записывайся на продвинутый онлайн-курс Symfony Framework от Отус (старт 21 ноября 2023 года) и получи возможность:
✅ развивать идеи Java Spring в PHP-экосистеме
✅ участвовать в создании enterprise-проектов со сложной бизнес-логикой
✅ претендовать на высокооплачиваемые вакансии middle+
Ответь на вопросы вступительного теста за 30 минут и проверь, насколько ты готов к освоению Symfony Framework: https://clck.ru/369kTP
This media is not supported in your browser
VIEW IN TELEGRAM
Java spring exception handling | обработка исключений за 5 минут
В этом видео речь пойдет об обработке исключений на уровне контроллера на языке Java. Покажу, какие инструменты есть у Spring.
00:23 - try catch, ResponseEntity
00:47 - наследование ResponseStatusException
01:10 - настройки отображения сообщения, названия ошибки и стек трейс в ответе
01:47 - бросаем ResponseStatusException
02:04 - аннотация @ ExceptionHandler
03:05 - аннотация @ RestControllerAdvice
03:40 - кастомный объект вместо ResponseEntity
04:02 - аннотация @ ResponseStatus
Код можно посмотреть тут: https://github.com/dispikerton/exceptionHandling
источник
👉@BookJava
В этом видео речь пойдет об обработке исключений на уровне контроллера на языке Java. Покажу, какие инструменты есть у Spring.
00:23 - try catch, ResponseEntity
00:47 - наследование ResponseStatusException
01:10 - настройки отображения сообщения, названия ошибки и стек трейс в ответе
01:47 - бросаем ResponseStatusException
02:04 - аннотация @ ExceptionHandler
03:05 - аннотация @ RestControllerAdvice
03:40 - кастомный объект вместо ResponseEntity
04:02 - аннотация @ ResponseStatus
Код можно посмотреть тут: https://github.com/dispikerton/exceptionHandling
источник
👉@BookJava
👍5
Что такое перегрузка методов?
Перегрузка методов — это свойство полиморфизма, в котором при помощи изменения сигнатуры метода можно создать различные реализации методов для одной и той же операции:
- одинаковое имя метода;
- различные аргументы;
- различный порядок аргументов;
Например, один и тот же
-
-
-
-
👉@BookJava
Перегрузка методов — это свойство полиморфизма, в котором при помощи изменения сигнатуры метода можно создать различные реализации методов для одной и той же операции:
- одинаковое имя метода;
- различные аргументы;
- различный порядок аргументов;
Например, один и тот же
add()
из List
может быть перегружен следующим образом и будет выполнять добавление разным способом, в зависимости от аргументов метода:-
add(Object o)
— просто добавляет объект;-
add(int index, Object o)
— добавляет объект в определенный индекс;-
add(Collection<Object> c)
— добавляет список объектов;-
add(int index, Collection<Object> c)
— добавляет список объектов, начиная с определенного индекса.👉@BookJava
👍5