Java библиотека
31.6K subscribers
2.34K photos
87 videos
9 files
2.14K links
Книги, статьи, мемы и многое другое для Java программиста!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrT4A

Мы на бирже: https://telega.in/c/javalib/

Сообщество VK https://vk.com/javatutorial
Download Telegram
Правильное понимание Single Responsibility Principle (SRP)

О принципе единственной ответственности слышали все. Конечно правильный ответ согласно книги Роберта Мартина "Чистая архитектура": SRP - это принцип единой ответственности.

Но при попытке разобраться в более дательном понимании принципа его часто трактуют слишком буквально:
Метод должен реализовывать одну задачу

Класс должен отвечать за один функционал


Да, это отчасти верно и такой принцип тоже есть, но он применяется на низшем уровне системы. SRP же применяется на более высоком уровне.

В итоге получаются сервисы, в которых вроде как всё «по SRP», но изменения в одном бизнес-сценарии ведут к каскадным правкам в десятках файлов. Это сигнал: принцип нарушен, несмотря на формальное соблюдение.

🟢О чём на самом деле говорит SRP

В классическом изложении (по Роберту Мартину):
Модуль должен иметь только одну причину для изменения.


И под модулем понимается не метод и не даже один класс, а группа классов и интерфейсов, объединённая общим потребителем — актором.

🟢Что это означает на практике

1. Определите акторов
Актор — это не всегда пользователь. Это может быть внешний сервис, внутренний инструмент, регламент. Важно: требования акторов не должны пересекаться. Если они меняются независимо — значит, им нужны отдельные модули.

2. Постройте модули вокруг акторов

Частая ошибка — «модуль пользователей», в котором и логика регистрации, и рассылка писем, и обработка GDPR-запросов.
Лучше разделить:
🔘один модуль обслуживает end-user’а,
🔘другой — юридические требования,
🔘третий — внутреннюю админку.

3. Не дробите код ради SRP, если это нарушает целостность модуля

SRP — это не о размере, а о мотивации изменений. Метод в 100 строк, обслуживающий один сценарий, допустим. А вот класс, который реагирует на десяток независимых событий — нет.

🟢Пример

Плохо:
public class OrderService {
public void placeOrder() { ... }
public void notifyCustomer() { ... }
public void saveAuditLog() { ... }
}


Этот класс изменится при любом изменении в бизнес-логике, в уведомлениях или в логировании. Три причины изменения — три актора.

✔️ Хорошо:

🔘OrderProcessor — отвечает за бизнес-сценарий
🔘NotificationService — отправка сообщений
🔘AuditService — логирование

Каждый компонент обслуживает одного актора, имеет свою причину для изменений и независимую эволюцию.

🟢Вывод

SRP стоит понимать как инструмент для проектирования архитектуры. Его задача — отделить контексты, которые меняются по разным причинам, и тем самым минимизировать связность и ограничить зону изменений. Не методы, не классы, а контексты и акторы.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍76
👨‍💻 Sentry для Java/Android — мониторинг ошибок в реальном времени. Этот инструмент помогает разработчикам быстро находить и исправлять ошибки в Java и Android-приложениях.

Инструмент отслеживает не только краши, но и проблемы производительности, интегрируясь с популярными библиотеками вроде Spring Boot и OkHttp. Он будет особенно полезен для команд, которые хотят улучшить стабильность мобильных и серверных приложений без лишнего ручного тестирования. Поддерживает нативный код через NDK.

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍4🔥2
Как создать идеальную внутреннюю платформу для разработчиков:
опыт MWS Cloud Platform
⬜️

В новой статье на Хабре инженер MWS рассказал, как построить эффективную команду Development Platform.

Автор поделился ключевыми принципами, которые помогут:

➡️Наладить взаимодействие между инфраструктурными и продуктовыми командами
➡️Минимизировать техдолг
➡️Создать культуру общего кода

⏩️Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥2
Виртуальные потоки — будущее или сырой эксперимент?

С выходом Java 21 виртуальные потоки (Virtual Threads) стали доступными для продакшна. Обещают удобный и масштабируемый способ работы с параллелизмом и без боли реактивщины.

🟢Сторонники Virtual Threads уверены: это долгожданный прорыв. Теперь можно писать привычный синхронный код, не заморачиваясь с CompletableFuture и реактивными фреймворками. Масштабируемость? Да! Сотни тысяч потоков без overhead-а — вполне реально.

🟢Напротив: tooling и экосистема пока не готовы. IDE лагают при отладке, JMX и трейсы работают криво, баги не редкость. Да и блокировки никуда не делись — просто теперь они маскируются, а не устраняются. По сути — "асинхронность для ленивых".

Стоит ли сразу использовать их в новых проектах или подождать пару релизов?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍84🔥4🍾2
👩‍💻 Магия IntelliJ IDEA

Когда нужно что-то быстро протестировать, написать фрагмент кода, проверить регулярку или сериализацию — не создавайте новый класс. Вместо этого используйте Scratch File (Ctrl + Alt + Shift + Insert).

🟢Что делает

— Создаёт временный файл вне проекта
— Поддерживает Java (и другие языки), автодополнение, импорт, выполнение
— Сохраняется автоматически, можно переключаться между файлами

🟢Зачем это нужно

— Быстрые пробы кода без засорения проекта
— Подходит для написания утилит, генерации данных, логов
— Удобно держать список SQL-запросов, curl-ов или шаблонов прямо в IDE

🟢Как использовать

— Нажмите Ctrl + Alt + Shift + Insert → выберите язык (например, Java)
— Пишите как обычно: public static void main, System.out.println() — и запускайте
— Можно открыть менеджер Scratch-файлов через Project > Scratches and Consoles

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥188👍7
Задача:


public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;

System.out.println(a == b); // ?
System.out.println(c == d); // ?
System.out.println(c.equals(d)); // ?
}
}


Что выведет программа?
🧠 Подвох:
Многие ожидают:


true
true
true

Но на самом деле Java напечатает:


true
false
true


🧠 Объяснение:
В Java значения Integer от -128 до 127 кэшируются (Integer Cache). То есть Integer.valueOf(127) возвращает один и тот же объект.

a == b → true потому что 127 в диапазоне кэширования.

c == d → false потому что 128 не кэшируется, создаются разные объекты.

.equals() сравнивает значения, поэтому c.equals(d) → true.

Урок:
Никогда не сравнивай Integer, Long, Boolean и другие объекты-обёртки через ==. Используй .equals().

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍239🔥6
Lombok — спасение от boilerplate или технический долг?

Lombok давно стал популярным решением. Аннотации вроде @Getter, @Builder, @Slf4j избавляют от рутинного кода и ускоряют разработку.

🟢За Lombok
— Устраняет шаблонный код и снижает количество ручных ошибок.
— Удобен при работе с immutable‑объектами и внедрении зависимостей через конструкторы.

🟢Против Lombok
— Зависимость от нестабильных internal‑API.
— Требует обязательной поддержки на всех IDE/CI.
— За «синтаксический сахар» приходится платить техническим долгом.

Подключать Lombok и ускорять разработку ценой стабильности, или отказаться и держать чистоту кода?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍64🔥3
🔐 pac4j — универсальный фреймворк для аутентификации и авторизации в Java-приложениях. Этот инструмент упрощает интеграцию десятков механизмов проверки подлинности в веб-сервисы и MVC-фреймворки (Spring, Play, Vert.x и другие).

Проект обладает модульностью: можно собрать систему безопасности как конструктор, комбинируя компоненты для работы с ролями, CSRF-защитой или CORS. Поддерживается даже экзотика вроде Kerberos или проверки по IP-адресу. При этом код остаётся читаемым благодаря Lombok в новых версиях.

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥43
Генерация Event-Driven архитектуры на Spring + Kafka

Классический REST не справляется с масштабом и скоростью реакции? Пора перейти к событийной архитектуре: Kafka + Spring Boot. Спросите AI — и получите продуманный шаблон микросервиса с продюсерами, консьюмерами, сериализацией, хэндлингом ошибок и даже dead-letter-топиками.

📝 Промпт:


Generate a production-grade Java Spring Boot microservice using Apache Kafka for event-driven architecture.
— Use Spring Boot 3 and Spring Kafka.
— Implement Kafka producers and consumers for a user.created event.
— Use Avro schema for message serialization and Schema Registry for compatibility.
— Include retry logic and Dead Letter Topic (DLT) support for failed messages.
— Handle message headers and custom error handling.
— Add integration tests using Embedded Kafka and Testcontainers.


💡 Расширения:

— Добавьте Implement the outbox pattern using a transactional Kafka producer and Debezium CDC, чтобы гарантировать доставку событий и избежать дублирования при сбоях в БД.
— Добавьте Integrate observability using Micrometer for Prometheus and OpenTelemetry for distributed tracing, чтобы отслеживать метрики и трассировать поток сообщений сквозь микросервисы.
— Добавьте Generate Kafka topic and consumer group configuration using Terraform, чтобы автоматизировать инфраструктуру и обеспечить консистентную настройку топиков в Dev/Stage/Prod.
— Добавьте Support dynamic partitioning and load balancing among consumers, чтобы масштабировать консьюмеров при увеличении нагрузки.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍5🔥5
👩‍💻 Spring AI — новый проект от Spring, упрощающий интеграцию ИИ-моделей в Java-приложения. Он предлагает унифицированный API для работы с разными провайдерами, поддерживая чат-ботов, генерацию изображений и текста, а также векторизацию данных.

Проект вдохновлён LangChain, но адаптирован под Spring-экосистему: здесь есть автоматическая конфигурация через Spring Boot, поддержка векторных баз данных и инструменты для оценки качества ответов моделей. Разработчики делают акцент на переносимость кода между разными ИИ-сервисами.

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥6👍3
👩‍💻 Магия IntelliJ IDEA

Забудьте про System.out.println() в логике — используйте Evaluate Expression прямо во время отладки, чтобы проверить любые значения на лету.

🟢Что делает

— Позволяет выполнять произвольные выражения прямо во время паузы
— Работает с контекстом текущего стека: переменные, поля, this
— Поддерживает сложные конструкции: myList.stream().filter(...).collect(...)

🟢Зачем это нужно

— Позволяет быстро проверять гипотезы при отладке
— Избавляет от лишних логов или временных переменных
— Помогает исследовать поведение без изменения кода

🟢Как использовать

— Поставьте breakpoint и запустите Debug
— Когда выполнение остановится, нажмите Alt + F8
— Введите выражение и нажмите Evaluate

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍12🔥5
🐘 Hibernate ORM — зрелый ORM-фреймворк для Java, который остается стандартом де-факто для работы с реляционными БД. Хотя проект реализует JPA-спецификацию, он предлагает гораздо больше возможностей — от расширенного кэширования до поддержки экзотических СУБД вроде SAP HANA.

Разработчики уделяют внимание тестированию: в комплекте идут Docker-скрипты для быстрого развертывания 15+ СУБД и гибкая система профилей. Сборка требует JDK 21, но сохраняет совместимость с Java 17.

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍5🔥2
👩‍💻 Генерация аудита пользовательских действий в Spring Boot

Нужно отслеживать, кто что сделал в приложении: создал пользователя, обновил заказ или удалил файл? Реализуйте модуль аудита, который не просто логирует в консоль, а сохраняет структурированные события в базу или брокер. AI поможет с шаблоном, который можно встроить в любой микросервис.

📝 Промпт:


Generate a reusable audit logging module for a Spring Boot 3 application.

— Use Spring AOP to intercept service-layer methods annotated with @Auditable.
— Capture method name, parameters, execution time, and authenticated user details.
— Log audit events asynchronously to Kafka with a custom AuditEvent structure.
— Use JSON for message serialization and include correlation IDs in headers.
— Include fallback to local file logging in case of Kafka failure.
— Add integration with Spring Security to extract user identity from the context.
— Write unit and integration tests using JUnit 5 and Testcontainers.


💡 Расширения:

— Добавьте Implement audit event persistence to PostgreSQL using Spring Data JPA, чтобы хранить критические события даже при сбоях брокера.
— Добавьте Include context metadata (request IP, user-agent) using ServletRequest attributes, чтобы повысить трассируемость действий пользователя.
— Добавьте Add audit dashboard using Spring Boot Admin and Grafana, чтобы визуализировать действия и аномалии в реальном времени.
— Добавьте Integrate OpenTelemetry spans around auditing logic, чтобы отслеживать поток аудита между микросервисами на уровне трассировки.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥63👍2
👩‍💻 BTrace — динамический инструмент для трассировки Java-приложений. Проект позволяет безопасно отслеживать работу Java-программ в реальном времени без перезапуска. Встраивает байткод для мониторинга производительности, логирования вызовов методов или анализа проблем прямо в работающее приложение.

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

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥54
Java Guru - вопросы и задачи с собеседований. Канал с помощью которого ты точно получишь оффер!

👩‍💻 Android Developer - канал для андроид разработчиков! Статьи, вопросы и задачи с собеседований, лайфхаки.

👩‍💻 Kotlin Developer - самый топовый канал для котлин разработчика!

📕 Книги для Java программиста - канал с книгами по Java. Постоянно выходят новинки как на русском так и на английском языке!

📰 Java News - канал с последними новостями из мира Java!
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1🔥1
Правильное понимание Liskov Substitution Principle (LSP)

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

Однако, давайте разберем это более подробно.

🟢Что на самом деле означает LSP?

В классическом виде (по Барбаре Лисков):
Объекты программы должны быть заменяемы экземплярами их подтипов без изменения правильности работы программы.


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

🟢Часто встречаемые ошибки трактования LSP

1. Подмена функционала


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

Плохо:
class Bird {
void fly() { ... }
}

class Chicken extends Bird {
@Override
void fly() {
throw new UnsupportedOperationException("Chicken can't fly");
}
}


Этот пример нарушает LSP, потому что подкласс не может выполнять все действия родителя.

2. Нарушение инвариантов

Если подкласс добавляет новые ограничения или меняет условия, которые предполагались в родительском классе, это может привести к неожиданным результатам. Например, если родительский класс предполагает, что его методы могут работать в определённых диапазонах значений, а в подклассе эти значения не допустимы, это также нарушает принцип.

Плохо:
class Rectangle {
int width, height;

void setWidth(int width) { this.width = width; }
void setHeight(int height) { this.height = height; }
}

class Square extends Rectangle {
@Override
void setWidth(int width) {
this.width = this.height = width;
}

@Override
void setHeight(int height) {
this.height = this.width = height;
}
}


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

🟢Что на практике важно понимать о LSP

— Соблюдение контракта родительского класса

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

— Логика не должны быть нарушена, лишь расширена


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

— Наследование — это не просто копирование, а расширение возможностей

Правильное наследование позволяет создавать более специфичные классы без нарушения логики родительского класса.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍10🔥5
👩‍💻 jCasbin — библиотека контроля доступа для Java-приложений. Проект предлагает гибкую систему авторизации с поддержкой популярных моделей: ACL, RBAC, ABAC и других. Конфигурация правил доступа описывается в простых CONF-файлах, что позволяет легко адаптировать систему под разные сценарии — от RESTful API до сложных многоуровневых политик.

Инструмент имеет встроенный онлайн-редактор для тестирования правил прямо в браузере. Интегрируется с Spring Boot и работает с разными хранилищами политик, включая базы данных.

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍43
👩‍💻 Магия IntelliJ IDEA: Local History

Случайно удалили строки, или вдруг не можете вспомнить, что только что меняли? Здесь на помощь приходит Local History.

🟢Что делает

— Хранит локальные изменения файлов даже без коммитов
— Сохраняет историю редактирования на уровне IDE
— Позволяет вернуться к любой версии файла за определенный период времени

🟢Зачем это нужно

— Спасает, если случайно удалил важные строки или сделал нежелательное изменение
— Не требует настроек или использования системы контроля версий
— Мгновенно восстанавливает состояние файла без лишних усилий

🟢Как использовать

— Щелкните правой кнопкой на файле, выберите Local History -> Show History
— Выберите нужную версию и восстановите изменения

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥9👍4
⚡️ Это Имба.

ArnoldC — это императивный язык программирования, где основные конструкции заменяются известными фразами из фильмов Арнольда Шварценеггера.


- if → BECAUSE I'M GOING TO SAY PLEASE
- while → STICK AROUND
- return → I'LL BE BACK
- LISTEN TO ME VERY CAREFULLY name — объявление метода
- I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE — аргументы
- GIVE THESE PEOPLE AIR — non-void метод


Код компилируется в Java, работает на JVM — это не просто шутка. Язык стабилен, есть примеры и документация.

HASTA LA VISTA, BABY

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9😁6👍43
Media is too big
VIEW IN TELEGRAM
TCP Log-сервер на java (NIO)

В предыдущем видео Оптимизация неблокирующего TCP сервера на java (NIO) был оптимизирован TCP сервер.
Сейчас на его основе сделаем сервер для приема логов.
Для парсинга потока байт применим конечный автомат.


🌐🗣СМОТРЕТЬ VKVIDEO

📺🗣СМОТРЕТЬ RUTUBE

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2🔥2🍾2
👩‍💻 Генерация системы мониторинга микросервисов с Spring Boot

Хотите создать мощный инструмент мониторинга для ваших микросервисов? Используйте AI, чтобы автоматически генерировать код для сбора метрик, логирования и трассировки запросов в реальном времени. Это поможет эффективно отслеживать производительность и устранять узкие места в системе.

📝 Промпт:

Generate a monitoring system for microservices in a Spring Boot 3 application.

— Integrate Spring Actuator to expose application health metrics and endpoints.
— Use Micrometer for collecting metrics such as response time, request count, and error rates.
— Implement distributed tracing with OpenTelemetry and Zipkin for tracking requests across multiple services.
— Enable log aggregation with ELK Stack (Elasticsearch, Logstash, and Kibana) for centralized log management.
— Set up Prometheus and Grafana for visualizing real-time performance metrics on custom dashboards.
— Configure automatic health checks and alerting using Spring Boot Admin and Prometheus Alerts.
— Create custom metrics to track domain-specific application performance, such as user sign-ups or payment processing times.


💡 Расширения:

— Добавьте Integrate application performance profiling using JProfiler для захвата и анализа подробных данных о производительности.
— Добавьте Set up integration with Datadog or New Relic для получения дополнительных аналитических данных и обнаружения аномалий в приложении.
— Добавьте Implement circuit breaker patterns with Resilience4j для повышения стабильности системы при высоком трафике или сбоях сервисов.
— Добавьте Enable traceability for all API calls with correlation IDs для обеспечения сквозной трассировки запросов в распределенной системе.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍4🔥2