Java исполняется 28 лет, платформа Payara, Micronaut 4.0-M5, весенние обновления, JHipster Lite
Дайджест важных обновлений за последнюю неделю:
JDK 21 — багфикс
Spring Cloud 2022.0.3 обеспечивает совместимость с Spring Boot 3.1
Spring Shell 3.1.0, 3.0.4 и 2.1.10
Spring Security Kerberos 2.0-RC2 — обновление зависимостей к Spring Security 6.1.0
Payara Platform — исправление уязвимостей
Quarkus 3.0. 4 и 2.13.8 — исправление багов и документации
WildFly 28.0.1 — обновление зависимостей и исправление багов
Apache Camel 3.20.5 — исправления в модуле camel-jbang
JDKMon 17.0.61 добавляет свойство в файл jdkmon.properties для отключения уведомлений; и предоставляет исправления проблем, связанных с обнаруженными архитектурами ЦП и несколькими сборками одной и той же версии JDK.
JHipster Lite 0.33.0 — много фиксов и добавлений, например совместное использование свойств модуля между ландшафтным и патч-экранами; исправление нативных подсказок для интеграции JGit; и добавление провайдера DestroyRef.
На прошлой неделе Java исполнилось 28 лет, так как язык был представлен на конференции SunWorld 1995 23 мая 1995 года.
#дайджест
Дайджест важных обновлений за последнюю неделю:
JDK 21 — багфикс
Spring Cloud 2022.0.3 обеспечивает совместимость с Spring Boot 3.1
Spring Shell 3.1.0, 3.0.4 и 2.1.10
Spring Security Kerberos 2.0-RC2 — обновление зависимостей к Spring Security 6.1.0
Payara Platform — исправление уязвимостей
Quarkus 3.0. 4 и 2.13.8 — исправление багов и документации
WildFly 28.0.1 — обновление зависимостей и исправление багов
Apache Camel 3.20.5 — исправления в модуле camel-jbang
JDKMon 17.0.61 добавляет свойство в файл jdkmon.properties для отключения уведомлений; и предоставляет исправления проблем, связанных с обнаруженными архитектурами ЦП и несколькими сборками одной и той же версии JDK.
JHipster Lite 0.33.0 — много фиксов и добавлений, например совместное использование свойств модуля между ландшафтным и патч-экранами; исправление нативных подсказок для интеграции JGit; и добавление провайдера DestroyRef.
На прошлой неделе Java исполнилось 28 лет, так как язык был представлен на конференции SunWorld 1995 23 мая 1995 года.
#дайджест
Какой CVS пользуетесь?
Anonymous Poll
34%
Gitlab
46%
Github
0%
SourceForge
0%
GNU Savannah
0%
Launchpad
17%
Bitbucket
2%
Другое (напишу в комментариях)
👩💻 Отладка контекста безопасности - Spring Security в деталях
При работе с контекстом безопасности Spring Security иногда возникают ситуации, когда разрабатываемое приложение начинает себя вести не очевидно, отвечать ошибками с HTTP-статусом 403, но без каких-либо подробностей, в том числе и в логах. И в этом случае приходится браться за отладку, о простых способах которой автор расскажет в этом ролике.
При работе с контекстом безопасности Spring Security иногда возникают ситуации, когда разрабатываемое приложение начинает себя вести не очевидно, отвечать ошибками с HTTP-статусом 403, но без каких-либо подробностей, в том числе и в логах. И в этом случае приходится браться за отладку, о простых способах которой автор расскажет в этом ролике.
#вопросы_с_собеседований
Для Enum есть специальный класс java.util.EnumSet. Зачем? Чем авторов не устраивал HashSet или TreeSet?
EnumSet - это реализация интерфейса Set для использования с перечислениями (Enum). В структуре данных хранятся объекты только одного типа Enum, указываемого при создании. Для хранения значений EnumSet использует массив битов (bit vector), - это позволяет получить высокую компактность и эффективность. Проход по EnumSet осуществляется согласно порядку объявления элементов перечисления.
Все основные операции выполняются за O(1) и обычно (но не гарантированно) быстрее аналогов из HashSet, а пакетные операции (bulk operations), такие как containsAll() и retainAll() выполняются даже гораздо быстрей.
Помимо всего EnumSet предоставляет множество статических методов инициализации для упрощенного и удобного создания экземпляров.
Для Enum есть специальный класс java.util.EnumSet. Зачем? Чем авторов не устраивал HashSet или TreeSet?
EnumSet - это реализация интерфейса Set для использования с перечислениями (Enum). В структуре данных хранятся объекты только одного типа Enum, указываемого при создании. Для хранения значений EnumSet использует массив битов (bit vector), - это позволяет получить высокую компактность и эффективность. Проход по EnumSet осуществляется согласно порядку объявления элементов перечисления.
Все основные операции выполняются за O(1) и обычно (но не гарантированно) быстрее аналогов из HashSet, а пакетные операции (bulk operations), такие как containsAll() и retainAll() выполняются даже гораздо быстрей.
Помимо всего EnumSet предоставляет множество статических методов инициализации для упрощенного и удобного создания экземпляров.
IEEEXtreme — 24-ех часовое соревнование по программированию, в котором участникам предлагается решать разнообразные задачки. Недавно был проведен эксперимент, в котором нейросеть ChatGPT принимала участие в соревновании, причем тестировали три языка: Java, C++ и Python. Результат печальный: в среднем человек оказывается в 3-5 раз более успешным, а на advanced уровне эффективность ChatGPT падает в 23 раза. При этом разница между 4 и 3.5 версией нейросети практически отсутствует.
Восстание машин отменяется?
Восстание машин отменяется?
Зубчатый массив в Java
Зубчатый массив — это массив массивов, в котором массивы элементов могут быть разных размеров, т. е. мы можем создать двумерный массив, но с переменным числом столбцов в каждой строке. Эти типы массивов также известны как зубчатые массивы.
Подробнее о зубчатых массивах можно почитать здесь.
Зубчатый массив — это массив массивов, в котором массивы элементов могут быть разных размеров, т. е. мы можем создать двумерный массив, но с переменным числом столбцов в каждой строке. Эти типы массивов также известны как зубчатые массивы.
Подробнее о зубчатых массивах можно почитать здесь.
NullPointer Exception
Исключение нулевого указателя возникает в Java довольно часто при попытке вызова метода несуществующего объекта.
Рассмотрим строчку кода из примера 1 на картинке. Если объект school окажется равен null или его метод listStudents вернет null, вы получите исключение NullPointerException.
Хорошей практикой разработки на Java является предварительная проверка на null в методах (как в примере 2).
Исключение нулевого указателя возникает в Java довольно часто при попытке вызова метода несуществующего объекта.
Рассмотрим строчку кода из примера 1 на картинке. Если объект school окажется равен null или его метод listStudents вернет null, вы получите исключение NullPointerException.
Хорошей практикой разработки на Java является предварительная проверка на null в методах (как в примере 2).
Подборка полезных статей по Java на самые разные темы. Сохраняйте себе:
☕️ Может ли Java-приложение использовать больше памяти, чем размер кучи?
☕️ Выходя за рамки JUnit. Создаем сложные расширения
☕️ Запросы к MongoDB из Java с помощью билдера фильтров
☕️ JDBC vs JPA
☕️ Java библиотека для работы с внешним сервисом по протоколу RESTful API
☕️ Как сгенерировать UUID в качестве первичных ключей при помощи Hibernate
☕️ Парсинг JSON с помощью Jackson
☕️ FAQ по var в Java
☕️ JUnit: тестирование методов, вызывающих System.exit()
☕️ Абстрактные классы и интерфейсы в Java
☕️ Может ли Java-приложение использовать больше памяти, чем размер кучи?
☕️ Выходя за рамки JUnit. Создаем сложные расширения
☕️ Запросы к MongoDB из Java с помощью билдера фильтров
☕️ JDBC vs JPA
☕️ Java библиотека для работы с внешним сервисом по протоколу RESTful API
☕️ Как сгенерировать UUID в качестве первичных ключей при помощи Hibernate
☕️ Парсинг JSON с помощью Jackson
☕️ FAQ по var в Java
☕️ JUnit: тестирование методов, вызывающих System.exit()
☕️ Абстрактные классы и интерфейсы в Java
📝 Как правильно составить сопроводительное письмо программисту
Давайте разберемся, зачем нужно сопроводительное письмо и как его написать так, чтобы вас захотели взять на работу.
🔗 Основной сайт
🔗 Зеркало
Давайте разберемся, зачем нужно сопроводительное письмо и как его написать так, чтобы вас захотели взять на работу.
🔗 Основной сайт
🔗 Зеркало
🎡 Что такое комбинаторика и как она используется в программировании
Расскажем, какие задачи помогает решать комбинаторика и зачем программистам нужно ее знать.
🔗 Основной сайт
🔗 Зеркало
Расскажем, какие задачи помогает решать комбинаторика и зачем программистам нужно ее знать.
🔗 Основной сайт
🔗 Зеркало
Какое исключение выбрасывается при возникновении ошибки в блоке инициализации класса?
Если возникшее исключение - наследник
• для статических блоков инициализации будет выброшено
• для нестатических будет проброшено исключение-источник.
Если возникшее исключение - наследник
Если возникшее исключение - наследник
RuntimeException
:• для статических блоков инициализации будет выброшено
java.lang.ExceptionInInitializerError
;• для нестатических будет проброшено исключение-источник.
Если возникшее исключение - наследник
Error
, то в обоих случаях будет выброшено java.lang.Error
. Исключение: java.lang.ThreadDeath
- смерть потока. В этом случае никакое исключение выброшено не будет.#вопросы_с_собеседований
Можем ли мы перегрузить методы по возвращаемому типу?
Мы не можем перегружать по возвращаемому типу. Это поведение аналогично C++.
Можем ли мы перегрузить методы по возвращаемому типу?
Мы не можем перегружать по возвращаемому типу. Это поведение аналогично C++.
🌵 Мексиканская перестрелка: какую IT-профессию выбрать джуну в 2023 году, чтобы зарабатывать $100кк в наносек
В этой статье мы рассмотрим несколько перспективных IT-направлений, которые приблизят вас к заветным цифрам на вашем банковском счете.
Читать статью
В этой статье мы рассмотрим несколько перспективных IT-направлений, которые приблизят вас к заветным цифрам на вашем банковском счете.
Читать статью
Кто кого расширяет: Queue расширяет Deque, или Deque расширяет Queue?
Queue — это очередь, которая обычно (но не обязательно) строится по принципу FIFO (First-In-First-Out) — соответственно извлечение элемента осуществляется с начала очереди, вставка элемента — в конец очереди. Хотя этот принцип нарушает, к примеру, PriorityQueue, использующая «natural ordering» или переданный Comparator при вставке нового элемента.
Deque (Double Ended Queue) расширяет Queue и, согласно документации, это линейная коллекция, поддерживающая вставку/извлечение элементов с обоих концов. Помимо этого реализации интерфейса Deque могут строится по принципу FIFO, либо LIFO.
Реализации и Deque, и Queue обычно не переопределяют методы equals() и hashCode(), вместо этого используются унаследованные методы класса Object, основанные на сравнении ссылок.
#вопросы_с_собеседований
Queue — это очередь, которая обычно (но не обязательно) строится по принципу FIFO (First-In-First-Out) — соответственно извлечение элемента осуществляется с начала очереди, вставка элемента — в конец очереди. Хотя этот принцип нарушает, к примеру, PriorityQueue, использующая «natural ordering» или переданный Comparator при вставке нового элемента.
Deque (Double Ended Queue) расширяет Queue и, согласно документации, это линейная коллекция, поддерживающая вставку/извлечение элементов с обоих концов. Помимо этого реализации интерфейса Deque могут строится по принципу FIFO, либо LIFO.
Реализации и Deque, и Queue обычно не переопределяют методы equals() и hashCode(), вместо этого используются унаследованные методы класса Object, основанные на сравнении ссылок.
#вопросы_с_собеседований
Что такое перегрузка методов?
Перегрузка методов — это свойство полиморфизма, в котором при помощи изменения сигнатуры метода можно создать различные реализации методов для одной и той же операции:
☕️ одинаковое имя метода;
☕️ различные аргументы;
☕️ различный порядок аргументов;
Например, один и тот же add() из List может быть перегружен следующим образом и будет выполнять добавление разным способом, в зависимости от аргументов метода:
☕️ add(Object o) — просто добавляет объект;
☕️ add(int index, Object o) — добавляет объект в определенный индекс;
☕️ add(Collection c) — добавляет список объектов;
☕️ add(int index, Collection c) — добавляет список объектов, начиная с определенного индекса.
#вопросы_с_собеседований
Перегрузка методов — это свойство полиморфизма, в котором при помощи изменения сигнатуры метода можно создать различные реализации методов для одной и той же операции:
☕️ одинаковое имя метода;
☕️ различные аргументы;
☕️ различный порядок аргументов;
Например, один и тот же add() из List может быть перегружен следующим образом и будет выполнять добавление разным способом, в зависимости от аргументов метода:
☕️ add(Object o) — просто добавляет объект;
☕️ add(int index, Object o) — добавляет объект в определенный индекс;
☕️ add(Collection c) — добавляет список объектов;
☕️ add(int index, Collection c) — добавляет список объектов, начиная с определенного индекса.
#вопросы_с_собеседований
Подборка новых полезных материалов по разработке, сохраняй себе:
☕️ Визуализация популярных команд Git
☕️ 11 интересных фишек Java
☕️ Рекомендации по миграции на Spring 6
☕️ Security, Cloud с JWT и WebFlux
☕️ Разработчики Java продолжают работать над упрощением языка и бороться с его многословностью
☕️ Love, Spring and HTTP Bugs
☕️ Быстрые фичи IntelliJIDEA
☕️ Как правильно делать кодревью
☕️ Как IntelliJIDEA помогает в анализе зависимостей
☕️ Про виртуальные потоки и когда их применять
#дайджест
☕️ Визуализация популярных команд Git
☕️ 11 интересных фишек Java
☕️ Рекомендации по миграции на Spring 6
☕️ Security, Cloud с JWT и WebFlux
☕️ Разработчики Java продолжают работать над упрощением языка и бороться с его многословностью
☕️ Love, Spring and HTTP Bugs
☕️ Быстрые фичи IntelliJIDEA
☕️ Как правильно делать кодревью
☕️ Как IntelliJIDEA помогает в анализе зависимостей
☕️ Про виртуальные потоки и когда их применять
#дайджест
Джуны в шоке, какие таблицы ведут тимлиды. А вы прошли бы такой отбор?
#интерактив
#интерактив
👩💻 Docker Compose и Spring Boot 3.1 👩💻
Наверняка вам приходилось запускать разрабатываемое приложение для какого-то ручного тестирования разрабатываемых функций. А для этого, как правило, нужно некоторое окружение: базы данных, серверы кэша, брокеры очередей сообщений и т.д.
И чтобы не разворачивать это всё вручную, можно использовать контейнеры, а разработчики Spring Boot предлагают интеграцию Spring Boot и Docker Compose, благодаря которой использование контейнеров требует минимум кода.
Смотреть видео
Наверняка вам приходилось запускать разрабатываемое приложение для какого-то ручного тестирования разрабатываемых функций. А для этого, как правило, нужно некоторое окружение: базы данных, серверы кэша, брокеры очередей сообщений и т.д.
И чтобы не разворачивать это всё вручную, можно использовать контейнеры, а разработчики Spring Boot предлагают интеграцию Spring Boot и Docker Compose, благодаря которой использование контейнеров требует минимум кода.
Смотреть видео