java_iibrary | Unsorted

Telegram-канал java_iibrary - Java Portal | Программирование

12073

Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg

Subscribe to a channel

Java Portal | Программирование

Сегодняшняя концепция: Consistent Hashing (согласованное хеширование)

Обычное хеширование:
Добавили 1 сервер
↓
Почти все ключи перераспределяются

Согласованное хеширование:
Добавили 1 сервер
↓
Перемещаются только ключи, находящиеся рядом с ним

Эта простая идея лежит в основе таких систем, как:
• Redis Cluster
• Apache Cassandra
• Amazon DynamoDB
• Memcached

Одна из самых важных концепций, на которых строятся масштабируемые распределённые системы.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Почему многопоточность — это сложно?
Многопоточность объединяет сразу несколько непростых концепций.

▪️Concurrency (конкурентное выполнение)
Несколько задач выполняются одновременно или создают видимость одновременного выполнения. Из-за этого порядок выполнения становится непредсказуемым.
▪️Synchronization (синхронизация)
Нужна для защиты общих данных от одновременного изменения несколькими потоками. Без неё возникают race condition, повреждение данных и трудноуловимые баги.
▪️Coordination (координация)
Потоки часто зависят друг от друга. Нужно управлять порядком выполнения задач, ожиданием результатов и обменом данными между потоками.
▪️Visibility (видимость изменений)
Один поток должен видеть изменения, которые внесли другие потоки. Из-за кэшей процессора, оптимизаций компилятора и переупорядочивания инструкций это происходит не всегда автоматически.

Именно сочетание этих проблем делает многопоточность сложной. Программа может работать правильно тысячу раз подряд и сломаться на тысяча первом запуске из-за другого порядка выполнения потоков.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java: Не делай поля публичными. Держи их private и используй геттеры/сеттеры для инкапсуляции. #Java #OOP

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Stream Gatherers официально стали финальной частью Java 24 (JEP 485).

Stream API существует ещё со времён Java 8, но набор промежуточных операций всегда был ограничен методами вроде filter(), map() и sorted().

Вместо того чтобы постоянно расширять стандартный API новыми операциями, Java теперь позволяет разработчикам создавать собственные.

Что дают Stream Gatherers:
• Используются через метод gather() для любого стрима
• Позволяют реализовать собственную логику через интерфейс Gatherer
• Работают как обычные промежуточные операции Stream API
• Были доступны в Preview в Java 22 и Java 23
• Стали финальными в Java 24 без изменений API

Например, теперь можно написать собственный gatherer для фильтрации строк по длине, оконной обработки данных, дедупликации или других сценариев, которые раньше требовали сложных цепочек операций или кастомных решений вне Stream API.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java: Используйте блоки try-catch только там, где это действительно необходимо. Не применяйте исключения для управления логикой выполнения программы. #Java #BestPractices

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java: По возможности не возвращайте из методов изменяемые внутренние коллекции, чтобы:
Не раскрывать внутреннее состояние объекта, повышая безопасность.
Иметь возможность менять реализацию без риска сломать другие части приложения.

#Java #JavaDev

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Список сетевых протоколов и портов, которые встречаются чаще всего:

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Лучшие практики Spring Boot REST API

Часть 1
: Реализация API Get Collection

Часть 2: Реализация API Create и Update

Часть 3: Реализация FindById и DeleteById API

Часть 4: Обработка исключений в REST API

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Два backend-разработчика решали одну и ту же задачу.

Вариант A:

SELECT *
FROM users
WHERE email = ?


Вариант B:
SELECT *
FROM users
WHERE LOWER(email) = LOWER(?)


Какой запрос отправится в прод?

Многие выбирают B, потому что он выглядит надёжнее. Пользователь может ввести John@Example.com, а в базе лежит john@example.com.

Но есть нюанс.

В большинстве СУБД вызов LOWER() над колонкой ломает использование обычного индекса. Вместо быстрого Index Seek база часто уходит в полный скан таблицы.
На 100 строках разницы не видно.
На 10 миллионах пользователей разница становится очень заметной.

Поэтому в проде обычно используют один из вариантов:
• хранить email в нормализованном виде (например, всегда lowercase);
• использовать case-insensitive collation;
• создать функциональный индекс на LOWER(email).

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

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Многие пишут SQL-запросы сверху вниз и думают, что СУБД выполняет их в том же порядке.

Но SQL работает иначе.

Фактический порядок выполнения выглядит так:

1. FROM
2. JOIN
3. WHERE
4. GROUP BY
5. HAVING
6. SELECT
7. ORDER BY
8. LIMIT

Именно поэтому алиасы из SELECT нельзя использовать в WHERE, а ошибки в агрегатах часто оказываются не там, где их ищут.

Понимание порядка выполнения помогает:

• быстрее отлаживать запросы;
• правильно использовать агрегации;
• избегать логических ошибок;
• писать более предсказуемый SQL.

Если запрос ведёт себя странно, проверь не то, как он написан, а то, как его выполняет движок базы данных.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Большинство команд, которые делают data-агентов, городят целый зоопарк из роутеров, fine-tune моделей и RAG-пайплайнов поверх нескольких LLM.

OpenAI сделала иначе.

Их data-агент работает на одной модели и всего с 13 инструментами, при этом умеет ориентироваться в 1,5 эксабайта данных и 90 000 таблиц.

По словам команды, архитектура получилась на удивление простой.

Недавно OpenAI рассказала, как всё устроено под капотом:

• архитектура data-агента
• 6 уровней контекста, которые позволяют одной LLM уверенно работать с 90 000 таблиц
• 3 реальных сценария использования Codex внутри OpenAI
• 5 практических выводов для тех, кто строит собственных агентов под конкретную предметную область
• куда будет развиваться дата-платформа OpenAI дальше

Интересно, что главный вывод не про очередной сложный агентный фреймворк, а скорее про то, как далеко можно зайти с одной моделью, если правильно организовать контекст и инструменты.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java-совет: старайтесь избегать статических переменных, если они не хранят действительно глобальные значения.

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

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 Java: Удаляйте неиспользуемые импорты и переменные для повышения читаемости кода.

Лишние импорты и неиспользуемые переменные создают визуальный шум, усложняют навигацию по коду и затрудняют поддержку. Большинство IDE умеют автоматически находить и удалять такой код.

#Java #CleanCode

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java: избегайте магических чисел.

В Java магическим числом (Magic Number) называют жёстко заданное числовое значение, используемое в коде без какого-либо пояснения того, что именно оно обозначает.

Магические числа снижают читаемость кода и усложняют его сопровождение.

#JavaDev #CleanCode

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Extension API в JUnit 5 заменяет @RunWith, Runner и @Rule из JUnit 4.

✅ Единая модель: реализуете lifecycle-хуки вроде BeforeEachCallback вместо эксклюзивного Runner
✅ ParameterResolver инжектит зависимости в тесты, без наследования от базового класса

✅ Extensions компонуются: можно навесить несколько расширений через @ExtendWith.
Демо-проект на GitHub: https://github.com/mcasari/codingstrain/tree/main/x-posts-examples/junit5-extension-api-demo

#Java #JUnit5

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Твой бэкенд теперь умеет говорить.

Вышла open-source платформа: AI-агент подключается через MCP, сам находит ошибку и предлагает фикс, пока ты смотришь не на тот дашборд.

Неделю назад это был твой таск.

Называется Maple.

https://github.com/Makisuo/maple

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Вот забавный ресурс для изучения HTTP-кодов через мемы: 200, 404, 500 и компании. Отличный способ запомнить коды без скучных таблиц.

→ https://github.com/keijeizei/httpmemes

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Команда «docker run -it»

Когда контейнеру Docker необходимо запустить интерактивное приложение, такое как оболочка, языковая REPL или текстовый редактор, команде «docker run» требуются два дополнительных флага: -i и -t.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

В PostgreSQL 19 Beta 1 завезли ON CONFLICT DO SELECT.
Теперь можно попытаться вставить запись, а если она уже есть — сразу получить существующую.
Похоже, атомарный get-or-create наконец добрался до PostgreSQL.
#PostgreSQL #SQL

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Вышла статья о распространённых случаях, когда final-поля изменяются через рефлексию, и какие альтернативы можно использовать вместо этого.

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

Разбираются причины использования рефлексии для изменения final-полей, связанные проблемы и варианты миграции на более безопасные решения.

https://inside.java/2026/04/27/avoiding-final-field-mutation/

👉 Java Portal

Читать полностью…

Java Portal | Программирование

🔴 Завтра тестовое собеседование с Java-разработчиком

10 июня(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Виктор Анохин, старший разработчик из WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Виктор будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Виктору

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама.
О рекламодателе.

Читать полностью…

Java Portal | Программирование

💡 Java: Используйте default-методы в интерфейсах для сохранения обратной совместимости (начиная с Java 8).

Если добавить новый default-метод в интерфейс, существующие реализации не придётся менять. Они автоматически получат реализацию по умолчанию.

#Java #Interfaces

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Spring Boot 4.1 получит поддержку ленивого получения JDBC-соединений

DataSource будет оборачиваться в LazyConnectionDataSourceProxy, а физическое соединение из пула станет запрашиваться только в тот момент, когда приложению действительно потребуется выполнить JDBC-запрос. 🔥

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.1.0-RC1-Release-Notes

👉 Java Portal

Читать полностью…

Java Portal | Программирование

В Docker можно поднять полноценный Android-эмулятор одной командой.

Без установки Android Studio, ручной настройки AVD и прочей возни.

Что есть из коробки:

• аппаратное ускорение через GPU
• поддержка KVM для более высокой производительности
• headless-режим для CI/CD и автоматизации
• запуск полностью внутри Docker-контейнера

Удобная штука для тестирования Android-приложений, мобильной автоматизации и агентных сценариев.

Бесплатно и с открытым исходным кодом

https://github.com/HQarroum/docker-android

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Паттерн Circuit Breaker не пытается бесконечно достучаться до упавшего сервиса. Он понимает, когда пора остановиться.

Closed → Open → Half-Open → Closed

Как работает:
• Closed — запросы проходят нормально, ошибки отслеживаются.
• Open — после достижения порога ошибок новые запросы сразу отклоняются без попытки обратиться к сервису.
• Half-Open — через некоторое время пропускается несколько тестовых запросов.
• Closed — если сервис восстановился, трафик возвращается в штатный режим.

Что это даёт:
• защищает систему от каскадных сбоев;
• снижает нагрузку на проблемный сервис;
• уменьшает задержки для клиентов;
• ускоряет восстановление после инцидентов.

Защищай. Быстро отказывай. Восстанавливайся. Повторяй.

#SystemDesign #SoftwareArchitecture #Microservices #DevOps #BackendDevelopment

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Совет по Java: используйте StringBuilder вместо String для конкатенации строк в циклах.

String является неизменяемым (immutable), поэтому его использование в циклах, особенно больших, работает неэффективно.
StringBuilder является изменяемым (mutable) и оптимизирован для многократного добавления строк.

#SoftwareDevelopment

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Наткнулся на GitHub-репозиторий для изучения System Design - - - https://github.com/systemdesign42/system-design-academy

Внутри собраны материалы как для подготовки к собеседованиям, так и для понимания того, как устроены реальные системы.

Что есть:

• Основы System Design
• Базовые концепции AI Engineering
• Вопросы по System Design для собеседований
• Разборы архитектур реальных сервисов
• Упрощённые инженерные кейсы с визуализациями и схемами

Понравилось, что материал собран в одном месте и не требует прыгать между десятками статей, видео и блогов.

Хороший вариант для тех, кто хочет закрыть пробелы в архитектуре систем или подготовиться к design-интервью.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Почему Twelve-Factor App важен

Он описывает проверенные временем архитектурные паттерны и практики, которые можно применять к SaaS-приложениям. Эти подходы помогают создавать софт, который будет устойчивым и легко переносимым при деплое в онлайн-среду.

Двенадцать факторов:

I. Codebase
Одна кодовая база под управлением системы контроля версий, много окружений для деплоя

II. Dependencies
Явное объявление и изоляция зависимостей

III. Config
Хранение конфигурации в окружении

IV. Backing services
Внешние сервисы воспринимаются как подключаемые ресурсы

V. Build, release, run
Жёсткое разделение стадий сборки, релиза и запуска

VI. Processes
Приложение запускается как один или несколько Stateless-процессов

VII. Port binding
Экспорт сервисов через привязку к порту

VIII. Concurrency
Масштабирование через модель процессов

IX. Disposability
Максимальная надёжность за счёт быстрого старта и корректного завершения

X. Dev/prod parity
Минимизировать различия между dev, staging и production

XI. Logs
Логи рассматриваются как поток событий

XII. Admin processes
Админские задачи выполняются как одноразовые процессы

В книге Beyond the 12 Factor App Кевин Хоффман дополняет эти принципы новыми пунктами, включая телеметрию и безопасность:

- Один код, одно приложение
- API first
- Управление зависимостями
- Design, build, release, run
- Конфигурация, креды и код
- Логи
- Disposability
- Внешние сервисы
- Эквивалентность окружений
- Административные процессы
- Port binding
- Stateless-процессы
- Конкурентность
- Телеметрия
- Аутентификация и авторизация


👉 Java Portal

Читать полностью…

Java Portal | Программирование

Hibernate & JPA Cheatsheet

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Большинство разработчиков ни разу не открывали папку .git.
А именно там находится всё, что делает Git Gitом.

Git не является системой отслеживания изменений во времени. Git представляет собой content-addressable storage, построенное на основе направленного ациклического графа (DAG).

Все операции происходят внутри .git/objects/.
Git хеширует данные файлов и сохраняет их в виде четырёх типов объектов:

Blob → хранит только содержимое файла. Без имени файла, без пути. Два одинаковых файла в разных каталогах будут ссылаться на один и тот же blob.

Tree → хранит соответствие между именами файлов, правами доступа, путями и хешами blob-объектов или дочерних tree-объектов.

Commit → содержит ссылку на корневой tree-объект, а также информацию об авторе, временную метку и ссылку на родительский коммит.

Annotated Tag → содержит ссылку на коммит и собственные метаданные: имя автора тега, дату создания и сообщение тега.
Эти объекты образуют DAG:

Directed — дочерние объекты указывают на родительские.
Acyclic — ни один коммит не может ссылаться обратно на самого себя через цепочку связей.

Когда вы создаёте ветку, Git записывает один текстовый файл размером около 41 байта в:

.git/refs/heads/<имя-ветки>


Этот файл содержит:
40-символьный SHA-1 хеш
символ перевода строки в конце


Именно этот файл и представляет собой всю ветку.

Git не хранит файлы. Git хранит содержимое, связи между объектами и историю изменений.
Поймите устройство объектов Git. Освойте граф. Тогда станет понятно, как Git работает на самом деле.
#Git

👉 Java Portal

Читать полностью…
Subscribe to a channel