Маркерный интерфейс — это интерфейс, который не содержит ни одного метода.
Он используется для пометки классов, чтобы указать на определенные свойства или функциональность, которые могут быть использованы во время выполнения программы.
✅ Java библиотека #java
Он используется для пометки классов, чтобы указать на определенные свойства или функциональность, которые могут быть использованы во время выполнения программы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤3🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Тестирование играет важнейшую роль в обеспечении качества и надежности ваших приложений. Пять популярных фреймворков для тестирования:
1. JUnit:
🔹 Используется для модульного тестирования.
🔹 Простой, удобный в использовании и легко интегрируется с инструментами разработки.
🔹 Идеален для написания и запуска повторяемых тестов, обеспечивая правильное функционирование отдельных частей кода.
2. TestNG:
🔹 Поддерживает различные категории тестирования.
🔹 Гибкий, масштабируемый и подходит как для простых, так и для сложных тестов.
🔹 Предлагает расширенные функции, такие как параллельное тестирование, тестирование на основе данных и подробные отчеты.
3. Mockito:
🔹 Фреймворк для создания мок-объектов в модульных тестах.
🔹 Легкость в использовании, уменьшение шаблонного кода и интеграция с JUnit/TestNG.
🔹 Позволяет разработчикам тестировать части кода изолированно, не полагаясь на внешние зависимости.
4. Selenium:
🔹 Фреймворк для автоматизации веб-браузеров.
🔹 Поддержка кроссплатформенности, интеграция с TestNG/JUnit и активная поддержка сообщества.
🔹 Обеспечивает правильное функционирование веб-интерфейсов на разных браузерах и платформах.
5. Cucumber:
🔹 Инструмент для разработки на основе BDD.
🔹 Улучшает коммуникацию с нетехническими заинтересованными сторонами.
🔹 Использует спецификации на простом языке для написания тестов, что позволяет заказчику лучше понимать тестовые кейсы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Можно ли считать Final переменную константой?
Поскольку у нас не получится присвоить новое значение для final переменной, кажется, что это переменные константы. Но это только на первый взгляд. Если тип данных, на который ссылается переменная — immutable, то да, это константа.
А если тип данных mutable, то есть изменяемый, при помощи методов и переменных можно будет изменить значение объекта, на который ссылается final переменная, и в таком случае назвать ее константой нельзя. Так вот, на примере видно, что часть финальных переменных действительно константы, а часть — нет, и их можно изменить.
✅ Java библиотека #java
Поскольку у нас не получится присвоить новое значение для final переменной, кажется, что это переменные константы. Но это только на первый взгляд. Если тип данных, на который ссылается переменная — immutable, то да, это константа.
А если тип данных mutable, то есть изменяемый, при помощи методов и переменных можно будет изменить значение объекта, на который ссылается final переменная, и в таком случае назвать ее константой нельзя. Так вот, на примере видно, что часть финальных переменных действительно константы, а часть — нет, и их можно изменить.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁10👍8❤5🔥2
Контейнер Optional
Optional — это контейнер, который может содержать какое-то значение или не содержать ничего.
Он используется для обозначения отсутствия значения вместо null. Это позволяет избежать ошибок NullPointerException.
Optional появился в Java 8. Он представлен классом java.util.Optional.
Чтобы создать экземпляр Optional, используются статические методы:
— empty() для пустого Optional.
— of() для Optional с заданным значением.
Для получения значения из Optional используются методы get(), или orElse() с указанием значения по умолчанию. Также есть методы фильтрации значений, например filter(), map() и flatMap().
✅ Java библиотека #java
Optional — это контейнер, который может содержать какое-то значение или не содержать ничего.
Он используется для обозначения отсутствия значения вместо null. Это позволяет избежать ошибок NullPointerException.
Optional появился в Java 8. Он представлен классом java.util.Optional.
Чтобы создать экземпляр Optional, используются статические методы:
— empty() для пустого Optional.
— of() для Optional с заданным значением.
Для получения значения из Optional используются методы get(), или orElse() с указанием значения по умолчанию. Также есть методы фильтрации значений, например filter(), map() и flatMap().
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍7🔥3
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>LATEST</version>
</dependency>
Byte Buddy — это библиотека Java для генерации и манипулирования кодом для создания и модификации Java-классов во время выполнения Java-приложения.
Помимо самой кодогенерации, Byte Buddy позволяет создавать произвольные классы, а также предлагает удобный API для изменения классов вручную, с помощью Java-агента или во время сборки.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🔥3
Spring Scheduler — это часть Spring Framework, которая позволяет планировать и выполнять задачи в заданное время или по расписанию. Он избавляет от необходимости интеграции сторонних библиотек, предлагая встроенные решения для управления задачами.
Виды задач:
- @Scheduled — аннотация для запуска методов по расписанию.
- TaskScheduler — интерфейс для более гибкого управления задачами.
- Cron-выражения — для сложных расписаний.
- Простота использования за счёт минимальной конфигурации.
- Интеграция с другими частями Spring.
- Поддержка CRON-выражений для гибкости.
- Ограниченная поддержка в распределённых системах.
- Возможные сложности с тестированием задач.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍5🔥3
Mill стремится облегчить процесс сборки, для чего заимствует идеи из таких современных инструментов, как Maven, Gradle, Bazel и SBT.
Mill автоматизирует решение многих общих проблем, связанных с инструментами сборки, таких как кэширование, инкрементные повторные вычисления и параллелизм, что позволяет сосредоточить усилия на бизнес-логике, а Mill позаботится обо всем остальном.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤6🔥4😁3
⚙️ Java — различные форматы конфигурации
🟢 YAML
— Удобочитаемый формат сериализации данных
— Использует отступы для вложенности
— Часто используется для конфигурационных файлов и обмена данными
🟢 JSON
— Лёгкий формат обмена данными с использованием пар "ключ-значение"
— Широко используется в API, конфигурационных файлах и для обмена данными
🟢 XML
— Язык разметки, использующий теги для определения элементов данных и их структуры
— Часто применяется для представления структурированных данных и хранения документов
🟢 Java Properties
— Простой формат конфигурации с парами "ключ-значение"
— Используется в Java-приложениях для хранения настроек и конфигурационных данных
💬 Какой формат вы используете чаще всего?
✅ Java библиотека #java
— Удобочитаемый формат сериализации данных
— Использует отступы для вложенности
— Часто используется для конфигурационных файлов и обмена данными
— Лёгкий формат обмена данными с использованием пар "ключ-значение"
— Широко используется в API, конфигурационных файлах и для обмена данными
— Язык разметки, использующий теги для определения элементов данных и их структуры
— Часто применяется для представления структурированных данных и хранения документов
— Простой формат конфигурации с парами "ключ-значение"
— Используется в Java-приложениях для хранения настроек и конфигурационных данных
💬 Какой формат вы используете чаще всего?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍8🔥3
Вам нужно спроектировать и реализовать на Java следующую систему:
1. Система подключается к непрерывному потоку событий (
EventStream).2. Каждое событие (
Event) имеет структуру:
class Event {
String entityId;
Instant timestamp;
String eventType;
Map<String, Object> payload;
}
3. В реальном времени нужно собирать и поддерживать текущее состояние каждой сущности (
Entity), применяя полученные события.4. Система должна поддерживать откат состояния:
- Пользователь может запросить состояние любой сущности на любую произвольную временную точку (
Instant timestamp).- После отката система должна продолжать обрабатывать новые события без остановки и потери данных.
- Потокобезопасность обработки событий и запросов на откат.
- Высокая производительность: обработка миллионов событий в минуту.
- Быстрый откат состояния (target: < 100 мс).
- Только стандартные библиотеки Java (
java.util.concurrent, java.time, коллекции и т.д.).- Архитектура должна позволять добавлять новые типы событий без модификации существующего кода.
- Реализация механизма снимков (
snapshot) состояний для оптимизации откатов.- Автоматическое создание snapshot'ов каждые N событий для каждой сущности.
- Поддержка нескольких стратегий отката (например, быстрый откат по ближайшему snapshot + события, или чистая перемотка всех событий).
Архитектура: Четкая декомпозиция слоёв, масштабируемость и возможность расширения системы без существенных изменений базового кода.
Работа с многопоточностью: Гарантия безопасности доступа к общим структурам данных в условиях параллельной обработки событий.
Производительность: Минимизация блокировок, эффективная работа с большими объёмами данных, оптимизация по времени отклика и использованию ресурсов.
Чистота кода: Понятные и логичные интерфейсы, чистая реализация без "грязных хака", хорошая читаемость и поддерживаемость кода.
Способность предвидеть риски: Умение анализировать потенциальные угрозы системе, например, рост очередей при перегрузке событий или замедление обработки данных.
Стратегии оптимизации: Эффективное использование snapshot'ов состояния, продуманная организация хранения и восстановления событий.
Обработка ошибок и отказоустойчивость: Умение проектировать систему так, чтобы она корректно вела себя при сбоях, сетевых ошибках и высоких нагрузках.
- Проблема гонки состояний: если одновременно приходит событие и запрашивается откат — что происходит?
- Рост памяти: если хранить все события, как не "убить" память?
- Перепутанные таймстемпы: что делать, если события приходят с задержкой или не по порядку?
- Обновление типов событий: как легко добавить новый
eventType без переписывания всей логики?- Производительность при откате: как не делать полный перебор событий за годы работы?
- Используйте copy-on-write подход для состояний сущностей.
- Используйте параллельные структуры данных (
ConcurrentHashMap, ConcurrentSkipListMap и т.д.).- Реализуйте инкапсуляцию логики обработки событий через паттерн "Event Handler" или "Command Handler".
- Внедрите отдельный менеджер snapshot'ов и менеджер событий.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍7❤5
🦉 Apache ZooKeeper — координация распределенных систем без лишней сложности
В эпоху Kubernetes и сервис-мешей скромный ZooKeeper продолжает оставаться фундаментальным инструментом для управления конфигурацией и синхронизации распределенных систем. Последние версии проекта (3.5.5+) сохраняют минималистичный подход — чистые Java-бинарники, документация в Markdown и прозрачный процесс сборки через Maven.
Несмотря на появление альтернатив вроде etcd, ZooKeeper по-прежнему широко используется в Hadoop-экосистеме и как бэкенд для Apache Kafka.
🖥 GitHub
✅ Java библиотека #java
В эпоху Kubernetes и сервис-мешей скромный ZooKeeper продолжает оставаться фундаментальным инструментом для управления конфигурацией и синхронизации распределенных систем. Последние версии проекта (3.5.5+) сохраняют минималистичный подход — чистые Java-бинарники, документация в Markdown и прозрачный процесс сборки через Maven.
Несмотря на появление альтернатив вроде etcd, ZooKeeper по-прежнему широко используется в Hadoop-экосистеме и как бэкенд для Apache Kafka.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3🔥2
Наш чатик с вакансиями и резюме, присоединяйся: https://news.1rj.ru/str/job_java
Telegram
Java Job - Вакансии и резюме
Наш канал по Java @javalib
Вакансии Java, также можете скидывать свои резюме!
Купить звёзды: @PremiumBot
Вакансии Java, также можете скидывать свои резюме!
Купить звёзды: @PremiumBot
❤5👍3🔥1
—
choco install xpipeили
—
bash <(curl -sL https://github.com/xpipe-io/xpipe/raw/master/get-xpipe.sh) XPipe — open-source инструмент на Java, который позволяет получить доступ ко всей инфраструктуре сервера с локальной машины.
Он работает поверх установленных программ командной строки и не требует настройки на удаленных системах. Так что если вы используете такие инструменты, как ssh, docker, kubectl и т.д. для подключения к серверам, вы можете просто использовать XPipe поверх них.
XPipe полностью интегрируется с текстовыми редакторами, с терминалом, и с разными CLI утилитами.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤6🔥4⚡1
— Порождающие паттерны:
— Структурные паттерны:
— Поведенческие паттерны:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤9🔥6
Agrona предоставляет набор структур данных и вспомогательных методов, которые часто требуются при создании высокопроизводительных приложений на Java.
Многие из этих компонентов используются, к примеру, в Aeron для эффективной и надежной передачи IPC-сообщений по протоколу UDP и обеспечивают высокопроизводительную реализацию буферов для поддержки кодека сообщений Simple Binary Encoding.
Например, с помощью Agrona можно переписать код:
List<Integer> numbers = new ArrayList<>();
// fill numbers somehow
Map<Integer, Integer> counters = new HashMap<>();
for (Integer x : numbers) {
counters.compute(x, (k, v) -> v == null ? 1 : v + 1);
}
вот так:
IntArrayList numbers = new IntArrayList();
// fill numbers somehow
Int2IntCounterMap counters = new Int2IntCounterMap(0);
for (int i = 0; i < numbers.size(); i++) {
counters.incrementAndGet(numbers.getInt(i));
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤7👍3🎄1
1691972027119 (1).gif
7.7 MB
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤9🔥4
RoaringBitmap — это одна из лучших битовых карт;
используется в Apache Spark, Netflix Atlas, Apache Pinot, Tablesaw и во многих других компаниях.
RoaringBitmap превосходят обычные сжатые битовые карты, такие как WAH, EWAH или Concise. Изображения, сжатые с помощью RoaringBitmap могут быть до сотни раз легче обычных изображений
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍3🔥2
⚙️ 7 эффективных стратегий для масштабирования базы данных
🟢 Индексация: Анализируйте запросы вашего приложения и создавайте подходящие индексы для ускорения работы.
🟢 Материализованные представления: Предварительно вычисляйте результаты сложных запросов и сохраняйте их для быстрого доступа.
🟢 Денормализация: Упрощайте сложные соединения для повышения скорости выполнения запросов.
🟢 Вертикальное масштабирование: Увеличивайте ресурсы сервера (процессоры, оперативную память, хранилище) для улучшения производительности.
🟢 Кэширование: Храните часто запрашиваемые данные в быстром хранилище, чтобы снизить нагрузку на базу данных.
🟢 Репликация: Создавайте копии основной базы данных на разных серверах для увеличения объема операций чтения.
🟢 Шардинг: Разделяйте таблицы на более мелкие части и распределяйте их по серверам для улучшения работы с записью и чтением.
💬 Какие еще методы масштабирования используете вы?
✅ Java библиотека #java
💬 Какие еще методы масштабирования используете вы?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🔥1
Piranha — это инструмент для автоматического рефакторинга кода, связанного с устаревшими флагами.
Входными данными для Piranha являются имя флага и ожидаемое поведение;
также необходимо указать список API, связанных с флагами, в файле свойств.
Piranha будет использовать эти данные для автоматического рефакторинга кода в соответствии с ожидаемым поведением.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍4🔥2