Очередной #дайджест по Java:
☕ Асинхронный API First
Это принцип разработки, по которому API вашего приложения является наиболее важной частью вашего приложения.
☕ Как упростить себе жизнь: удобные юнит-тесты с JUnit и AssertJ
О практике использования фреймворка для модульного тестирования JUnit 5.
☕ Набор инструментов backend reliability инженера
О зонах ответственности BRE команды и инструментах, которые применяются для поддержания стабильной работы бэкенда на высоком уровне.
☕ Руководство про Pattern Matching в Java 21
Про новые возможности сопоставления с образцом (Pattern Matching) в Java 21.
☕ Асинхронный API First
Это принцип разработки, по которому API вашего приложения является наиболее важной частью вашего приложения.
☕ Как упростить себе жизнь: удобные юнит-тесты с JUnit и AssertJ
О практике использования фреймворка для модульного тестирования JUnit 5.
☕ Набор инструментов backend reliability инженера
О зонах ответственности BRE команды и инструментах, которые применяются для поддержания стабильной работы бэкенда на высоком уровне.
☕ Руководство про Pattern Matching в Java 21
Про новые возможности сопоставления с образцом (Pattern Matching) в Java 21.
🎤 QCon SF 2023: как Netflix на самом деле использует Java, Пол Баккер
Пол Баккер, разработчик в команде Java-платформы Netflix и соавтор книги Java 9 Modularity, положил конец мифу о том, что «Netflix — это микросервисы RxJava, а всем заправляют Hystrix, Spring Cloud и Chaos Monkeys».
Баккер описал оригинальную архитектуру знакомого приложения Netflix для просмотра фильмов, доступ к которому осуществляется через ТВ и другие устройства, подключаемые к API-серверу с поддержкой Groovy с помощью REST и gRPC-подключений к различным сервисам.
Также Пол представил другие архитектурные модели и отметил, что Java был и остается в активной разработке в Netflix. Они поддерживают дистрибутив OpenJDK Azul Zulu 17 с активным тестированием на JDK 21, запуская ~2800 приложений, созданных с использованием ~1500 библиотек. Gradle вместе с Nebula, коллекцией плагинов Gradle, созданных Netflix, и IntelliJ IDEA являются их предпочтительными инструментами сборки.
👉 Подробнее
#проектирование_систем #java
Пол Баккер, разработчик в команде Java-платформы Netflix и соавтор книги Java 9 Modularity, положил конец мифу о том, что «Netflix — это микросервисы RxJava, а всем заправляют Hystrix, Spring Cloud и Chaos Monkeys».
Баккер описал оригинальную архитектуру знакомого приложения Netflix для просмотра фильмов, доступ к которому осуществляется через ТВ и другие устройства, подключаемые к API-серверу с поддержкой Groovy с помощью REST и gRPC-подключений к различным сервисам.
Также Пол представил другие архитектурные модели и отметил, что Java был и остается в активной разработке в Netflix. Они поддерживают дистрибутив OpenJDK Azul Zulu 17 с активным тестированием на JDK 21, запуская ~2800 приложений, созданных с использованием ~1500 библиотек. Gradle вместе с Nebula, коллекцией плагинов Gradle, созданных Netflix, и IntelliJ IDEA являются их предпочтительными инструментами сборки.
👉 Подробнее
#проектирование_систем #java
Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode()?
Общий совет: выбирать поля, которые с большой долью вероятности будут различаться. Для этого необходимо использовать уникальные, лучше всего примитивные поля, например, такие как id, uuid. При этом нужно следовать правилу, если поля задействованы при вычислении hashCode(), то они должны быть задействованы и при выполнении equals().
#вопросы_с_собеседований
Общий совет: выбирать поля, которые с большой долью вероятности будут различаться. Для этого необходимо использовать уникальные, лучше всего примитивные поля, например, такие как id, uuid. При этом нужно следовать правилу, если поля задействованы при вычислении hashCode(), то они должны быть задействованы и при выполнении equals().
#вопросы_с_собеседований
SoftHashMap
SoftHashMap — это реализация интерфейса Map, которая использует слабые ссылки для хранения ключей и значений.
От обычной HashMap она отличается тем, что при нехватке памяти она может автоматически удалять наименее используемые элементы.
SoftHashMap часто применяется для реализации кешей, где допустима потеря части данных.
Например, кеш изображений в приложении. Если память закончилась, то часть картинок будет удалена из SoftHashMap, но основная часть приложения продолжит работать.
#код
SoftHashMap — это реализация интерфейса Map, которая использует слабые ссылки для хранения ключей и значений.
От обычной HashMap она отличается тем, что при нехватке памяти она может автоматически удалять наименее используемые элементы.
SoftHashMap часто применяется для реализации кешей, где допустима потеря части данных.
Например, кеш изображений в приложении. Если память закончилась, то часть картинок будет удалена из SoftHashMap, но основная часть приложения продолжит работать.
#код
Разработка децентрализованных приложений на Spring Boot: инструменты Web3 Tech
Автор рассказывает о библиотеках, которые помогут вам комфортно и эффективно создавать на JVM-языках программирования полноценные приложения, взаимодействующие со смарт-контрактами платформы.
Читать статью
Автор рассказывает о библиотеках, которые помогут вам комфортно и эффективно создавать на JVM-языках программирования полноценные приложения, взаимодействующие со смарт-контрактами платформы.
Читать статью
Вы используете механическую клавиатуру для печати или мембранную?
#интерактив
#интерактив
Экземплярный инициализатор
Экземплярный инициализатор — это блок кода внутри класса, который выполняется каждый раз при создании нового экземпляра класса. Он используется для инициализации экземплярных переменных.
#код
Экземплярный инициализатор — это блок кода внутри класса, который выполняется каждый раз при создании нового экземпляра класса. Он используется для инициализации экземплярных переменных.
#код
Очередной #дайджест по Java:
✍️ Как потратить дни, чтобы сэкономить секунды: продвинутые коммиты в GitLab
Коммит изменения в GitLab — фоновый и рутинный процесс, на который никто не закладывает рабочего времени. Но в нем есть действия, которые съедают 18 секунд при каждом коммите.
✍️ Ссылки на методы в Java
Лямбды в Java полезны во многих направлениях. Лямбда-выражения можно использовать для более простых задач, а лямбда-утверждения — для более сложных.
✍️ Размещаем Spring Boot приложение в Docker
Туториал по Docker Compose.
✍️ Различия между Spring Boot и Spring Cloud Framework
Цель статьи — помочь разработчикам понять различия между платформами и принять обоснованное решение, какую использовать для своего следующего проекта.
✍️ Как потратить дни, чтобы сэкономить секунды: продвинутые коммиты в GitLab
Коммит изменения в GitLab — фоновый и рутинный процесс, на который никто не закладывает рабочего времени. Но в нем есть действия, которые съедают 18 секунд при каждом коммите.
✍️ Ссылки на методы в Java
Лямбды в Java полезны во многих направлениях. Лямбда-выражения можно использовать для более простых задач, а лямбда-утверждения — для более сложных.
✍️ Размещаем Spring Boot приложение в Docker
Туториал по Docker Compose.
✍️ Различия между Spring Boot и Spring Cloud Framework
Цель статьи — помочь разработчикам понять различия между платформами и принять обоснованное решение, какую использовать для своего следующего проекта.
Класс ReentrantReadWriteLock
Класс ReentrantReadWriteLock используется для организации разделяемого доступа к ресурсам с разделением на чтение и запись.
Он позволяет эффективно организовать одновременный доступ к данным для чтения множеством потоков и исключительный доступ для записи отдельными потоками.
Проще говоря, множество потоков могут одновременно заходить в метод read, но в write может находиться только один поток в данный момент времени.
Это позволяет эффективно организовать доступ на чтение и запись.
#код
Класс ReentrantReadWriteLock используется для организации разделяемого доступа к ресурсам с разделением на чтение и запись.
Он позволяет эффективно организовать одновременный доступ к данным для чтения множеством потоков и исключительный доступ для записи отдельными потоками.
Проще говоря, множество потоков могут одновременно заходить в метод read, но в write может находиться только один поток в данный момент времени.
Это позволяет эффективно организовать доступ на чтение и запись.
#код
Оptimistic locking
optimistic locking — это стратегия контроля параллельного доступа к ресурсам или данным, которая позволяет не блокировать ресурсы в течение длительного времени. Она основывается на предположении, что конфликты при доступе к данным встречаются редко, и поэтому вместо того чтобы заблокировать ресурс целиком на протяжении операции, она позволяет нескольким потокам или процессам работать с данными параллельно.
Если возникает конфликт, то один из потоков получит уведомление об этом и может принять меры для разрешения конфликта.
#код
optimistic locking — это стратегия контроля параллельного доступа к ресурсам или данным, которая позволяет не блокировать ресурсы в течение длительного времени. Она основывается на предположении, что конфликты при доступе к данным встречаются редко, и поэтому вместо того чтобы заблокировать ресурс целиком на протяжении операции, она позволяет нескольким потокам или процессам работать с данными параллельно.
Если возникает конфликт, то один из потоков получит уведомление об этом и может принять меры для разрешения конфликта.
#код
ServletRequest
ServletRequest — это интерфейс, который предоставляет доступ к запросу, полученному сервлетом. Он используется для получения данных из запроса, таких как параметры, заголовки, атрибуты и др.
ServletRequest позволяет сервлету взаимодействовать с клиентом вне зависимости от деталей реализации или протокола запроса.
В этом примере из запроса получается параметр "name" с помощью метода getParameter(). Затем это значение используется для вывода приветствия в ответ клиенту.
#код
ServletRequest — это интерфейс, который предоставляет доступ к запросу, полученному сервлетом. Он используется для получения данных из запроса, таких как параметры, заголовки, атрибуты и др.
ServletRequest позволяет сервлету взаимодействовать с клиентом вне зависимости от деталей реализации или протокола запроса.
В этом примере из запроса получается параметр "name" с помощью метода getParameter(). Затем это значение используется для вывода приветствия в ответ клиенту.
#код
Что такое Executor?
Executor — это интерфейс, который позволяет запускать задачи асинхронно. Используется вместе с интерфейсами Callable и Future для асинхронного выполнения задач.
Он определяет единственный метод execute(), который принимает объект Runnable с задачей для выполнения.
Интерфейс позволяет отделить логику создания и запуска потоков от самих задач.
Потоки создаются заранее и хранятся в пуле, а задачи просто отправляются на выполнение через execute().
Это дает выигрыш в производительности, т. к. исключает накладные расходы на создание новых потоков.
#вопросы_с_собеседований
Executor — это интерфейс, который позволяет запускать задачи асинхронно. Используется вместе с интерфейсами Callable и Future для асинхронного выполнения задач.
Он определяет единственный метод execute(), который принимает объект Runnable с задачей для выполнения.
Интерфейс позволяет отделить логику создания и запуска потоков от самих задач.
Потоки создаются заранее и хранятся в пуле, а задачи просто отправляются на выполнение через execute().
Это дает выигрыш в производительности, т. к. исключает накладные расходы на создание новых потоков.
#вопросы_с_собеседований
Ключевое слово var
Ключевое слово var используется для объявления переменных с неявным типом.
Это позволяет компилятору автоматически выводить тип переменной исходя из присваиваемого значения.
Как видно из примера, используя var не нужно явно указывать тип переменной. Компилятор сам определит его исходя из присваиваемого значения. Это упрощает код в некоторых случаях.
#код
Ключевое слово var используется для объявления переменных с неявным типом.
Это позволяет компилятору автоматически выводить тип переменной исходя из присваиваемого значения.
Как видно из примера, используя var не нужно явно указывать тип переменной. Компилятор сам определит его исходя из присваиваемого значения. Это упрощает код в некоторых случаях.
#код
💻 Создание многопоточного клиент-серверного приложения на Java
В этом видео преподаватель пишет сервер на языке Java и простой клиент, которые передают информацию друг другу с помощью сокетов.
Смотреть на YouTube
В этом видео преподаватель пишет сервер на языке Java и простой клиент, которые передают информацию друг другу с помощью сокетов.
Смотреть на YouTube
ServletContext
ServletContext предоставляет сервлету доступ к контексту веб-приложения. Он содержит общую информацию о приложении и позволяет сервлетам взаимодействовать.
Доступ к ServletContext можно получить через метод getServletContext() класса ServletConfig.
Через ServletContext можно получить данные инициализационных параметров web.xml.
ServletContext позволяет сервлетам оставлять атрибуты, доступные всем сервлетам данного приложения.
Также с его помощью можно получить ресурсы приложения, например потоки ввода-вывода.
#код
ServletContext предоставляет сервлету доступ к контексту веб-приложения. Он содержит общую информацию о приложении и позволяет сервлетам взаимодействовать.
Доступ к ServletContext можно получить через метод getServletContext() класса ServletConfig.
Через ServletContext можно получить данные инициализационных параметров web.xml.
ServletContext позволяет сервлетам оставлять атрибуты, доступные всем сервлетам данного приложения.
Также с его помощью можно получить ресурсы приложения, например потоки ввода-вывода.
#код
Очередной #дайджест по Java:
✍️ Stone: знакомство с API
Полезный туториал.
✍️ Управление зависимостями в микросервисной архитектуре
Часто в микросервисной архитектуре возникают проблемы, связанные с обновлением версий библиотек или их подключением. Работая над каким-либо проектом в течение долгого времени можно столкнуться с тем, что разные микросервисы используют разные версии одной и той же библиотеки и ее обновление может затянуться из-за конфликтов.
✍️ Распределённые транзакции
На собеседованиях на позицию middle/senior разработчика часто задают вопросы по распределенным транзакциям в микросервисной архитектуре.
✍️ Java 21: новый подход к созданию строк
Java 21 предлагает много классных функциональностей, и одна из них — шаблоны строк (англ. String Templates). При том, что их целевое назначение не ограничивается только строковой интерполяцией, для Java-разработчиков они служат еще одним “правильным” способом конкатенации строк.
✍️ Stone: знакомство с API
Полезный туториал.
✍️ Управление зависимостями в микросервисной архитектуре
Часто в микросервисной архитектуре возникают проблемы, связанные с обновлением версий библиотек или их подключением. Работая над каким-либо проектом в течение долгого времени можно столкнуться с тем, что разные микросервисы используют разные версии одной и той же библиотеки и ее обновление может затянуться из-за конфликтов.
✍️ Распределённые транзакции
На собеседованиях на позицию middle/senior разработчика часто задают вопросы по распределенным транзакциям в микросервисной архитектуре.
✍️ Java 21: новый подход к созданию строк
Java 21 предлагает много классных функциональностей, и одна из них — шаблоны строк (англ. String Templates). При том, что их целевое назначение не ограничивается только строковой интерполяцией, для Java-разработчиков они служат еще одним “правильным” способом конкатенации строк.
Что вы чаще всего гуглите по работе?
#интерактив
#интерактив
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
LongAdder
LongAdder — это класс из пакета java.util.concurrent, оптимизированный для высокопроизводительного параллельного суммирования long значений.
LongAdder применяется в многопоточных приложениях, когда нужно эффективно подсчитать сумму или другое агрегатное значение из нескольких потоков.
Преимущества:
— Высокая скорость за счет разделения на сегменты и отсутствия блокировок.
— Минимизация конфликтов между потоками при обновлении.
— Лучше масштабируется на большом кол-ве ядер.
#код
LongAdder — это класс из пакета java.util.concurrent, оптимизированный для высокопроизводительного параллельного суммирования long значений.
LongAdder применяется в многопоточных приложениях, когда нужно эффективно подсчитать сумму или другое агрегатное значение из нескольких потоков.
Преимущества:
— Высокая скорость за счет разделения на сегменты и отсутствия блокировок.
— Минимизация конфликтов между потоками при обновлении.
— Лучше масштабируется на большом кол-ве ядер.
#код
Можно ли синхронизировать доступ к строке?
Хотя строки неизменяемы, то есть их содержимое нельзя изменить после создания, они могут использоваться из разных потоков.
Чтобы избежать race condition, когда два потока одновременно читают/записывают одну строку, можно использовать синхронизацию.
Для этого есть несколько способов:
— Объявить методы класса, которые работают со строкой, как synchronized.
— Использовать блок synchronized при работе со строкой.
— Использовать какой-либо lock (например ReentrantLock) для синхронизации доступа к строке.
— Использовать классы из java.util.concurrent для работы со строками, например StringBuffer.
#вопросы_с_собеседований
Хотя строки неизменяемы, то есть их содержимое нельзя изменить после создания, они могут использоваться из разных потоков.
Чтобы избежать race condition, когда два потока одновременно читают/записывают одну строку, можно использовать синхронизацию.
Для этого есть несколько способов:
— Объявить методы класса, которые работают со строкой, как synchronized.
— Использовать блок synchronized при работе со строкой.
— Использовать какой-либо lock (например ReentrantLock) для синхронизации доступа к строке.
— Использовать классы из java.util.concurrent для работы со строками, например StringBuffer.
#вопросы_с_собеседований
Интерфейс Iterable
Iterable используется для представления коллекций, которые можно итерировать или пройти в цикле.
Он определяет метод iterator(), который возвращает объект Iterator.
Этот Iterator позволяет поочередно получать элементы коллекций, также его можно использовать в цикле while или for-each для последовательного перебора всех элементов коллекции.
Это позволяет абстрагироваться от конкретного типа коллекции. Мы можем работать с Iterable и Iterator, не завися от того список это, множество или очередь. Такой подход упрощает использование разных коллекций.
#код
Iterable используется для представления коллекций, которые можно итерировать или пройти в цикле.
Он определяет метод iterator(), который возвращает объект Iterator.
Этот Iterator позволяет поочередно получать элементы коллекций, также его можно использовать в цикле while или for-each для последовательного перебора всех элементов коллекции.
Это позволяет абстрагироваться от конкретного типа коллекции. Мы можем работать с Iterable и Iterator, не завися от того список это, множество или очередь. Такой подход упрощает использование разных коллекций.
#код