Библиотека джависта | Java, Spring, Maven, Hibernate
24.1K subscribers
2K photos
38 videos
42 files
2.82K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://t.me/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
🔥 Вы ещё можете застать старый добрый Proglib — с вечным доступом к курсам.

С 1 августа всё меняется: навсегда — останутся только те, кто успел купить сейчас.

-40% на все курсы. Включая обновлённый Python (кроме курса по AI-агентам)

Это не просто распродажа. Это — последняя точка входа в Proglib Academy по старым правилам.

📚 Выбрать и забрать свой курс навсегда → https://clc.to/TBtqYA
😮 Топ-вакансий для джавистов за неделю

Java-разработчик (Логистическая платформа) — 300 000 —‍ 490 000 ₽ — гибрид (Санкт-Петербург, Москва)

Junior Java разработчик — до 100 000 ₽ — гибрид (Москва)

Java-разработчик — до 600 000₽ — удалёнка

Middle Java Developer — до 270 000 ₽ — удалёнка

➡️ Еще больше топовых вакансий — в нашем канале Java jobs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥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

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

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

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


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

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

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

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍85🔥3
Сохраняйте шпаргалку по cron

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍5🔥3
👑 Магия IntelliJ IDEA: Local History

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

🔹 Что делает

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

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

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

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

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

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍5🔥3
Возвращение Redis к open-source

С 2025 года Redis вернулся к open-source, выпустив Redis 8 под лицензией AGPLv3. После введения SSPL в 2024 году и резкой критики со стороны сообщества, Redis вернулся к истокам, но стоит ли этому радоваться?

Сторонники новой лицензии считают, что это правильный шаг, который восстановит доверие сообщества и вернёт Redis в ряды самых популярных инструментов для работы с БД в реальном времени. Однако критики утверждают, что этот ход больше связан с маркетингом и попыткой вернуть пользователей, чем с настоящими улучшениями.

⚡️ На практике:

— AGPLv3 обещает более открытое использование Redis в корпоративных и стартап-проектах.
— Но SSPL оставляет много вопросов о том, как Redis будет восприниматься в экосистеме open-source в будущем.

💬 Что думаете: реальная победа сообщества или просто попытка вернуть утраченные позиции на фоне конкурентов?

🐸 Библиотека джависта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
3🤔3👍2❤‍🔥1🔥1
🔍 Загадка для разработчиков

Что за термин загадан на картинке?

💬 Пишите в комменты ответ под спойлером.

🐸 Библиотека джависта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥1
Олды здесь? 👋 Помните ту самую боль ручного управления потоками, когда каждый new Thread().start() был отдельным приключением, а wait()/notify() превращали код в минное поле, где один неверный notifyAll() мог обрушить всю логику? Помните вечную молитву богам планировщика, чтобы ваш synchronized блок не привёл к дедлоку? 💀

Пост Антона Черноусова — это тёплый флешбэк в 2004 год, когда JSR 166 и пакет java.util.concurrent стали для нас настоящим глотком свежего воздуха . Это был не просто набор утилит, а смена парадигмы. Мы получили инструменты, которые решали проблемы на концептуально новом уровне.

Вместо ручного менеджмента потоков пришёл ExecutorService, который позволил думать о задачах, а не о жизненном цикле Thread. Вместо медленного Hashtable или Collections.synchronizedMap мы получили молниеносный ConcurrentHashMap. А вместо хрупких конструкций на wait()/notify() — мощные и понятные синхронизаторы вроде CountDownLatch и CyclicBarrier.

Именно этому и посвящена книга «Java Concurrency на практике». Она стала тем самым мануалом, который не просто описывал API, а учил мыслить в новой парадигме. Для опытных это отличный повод поностальгировать и оценить пройденный путь, а для молодых — понять, почему эти «классические» инструменты до сих пор являются основой большинства многопоточных приложений на Java.
6
⚙️ Генерация системы мониторинга микросервисов с 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 для обеспечения сквозной трассировки запросов в распределенной системе.

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42🔥1😁1🥱1