Forwarded from Библиотека задач по Java | тесты, код, задания
Что будет результатом запуска приложения?
Anonymous Quiz
9%
TransactionRequiredException
10%
BeanCreationException
45%
Пользователь будет создан, но метод выполнится без транзакции
3%
Ошибка компиляции
33%
Пользователь будет создан, транзакция успешно откроется и закроется
👍4🔥2❤1👏1
🔥 Вы ещё можете застать старый добрый Proglib — с вечным доступом к курсам.
С 1 августа всё меняется: навсегда — останутся только те, кто успел купить сейчас.
-40% на все курсы. Включая обновлённый Python (кроме курса по AI-агентам)
Это не просто распродажа. Это — последняя точка входа в Proglib Academy по старым правилам.
📚 Выбрать и забрать свой курс навсегда → https://clc.to/TBtqYA
С 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 ₽ — удалёнка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1🔥1
Принципе подстановки Лискова нередко трактуют слишком формально или упрощенно. Простой ответ: 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
👍8❤5🔥3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁24👍2🔥1😢1
Случайно удалили строки, или вдруг не можете вспомнить, что только что меняли? Здесь на помощь приходит Local History.
🔹 Что делает
— Хранит локальные изменения файлов даже без коммитов
— Сохраняет историю редактирования на уровне IDE
— Позволяет вернуться к любой версии файла за определенный период времени
🔹 Зачем это нужно
— Спасает, если случайно удалил важные строки или сделал нежелательное изменение
— Не требует настроек или использования системы контроля версий
— Мгновенно восстанавливает состояние файла без лишних усилий
🔹 Как использовать
— Щелкните правой кнопкой на файле, выберите Local History -> Show History
— Выберите нужную версию и восстановите изменения
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍5🔥3
С 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
😁23🔥3👍2
🔍 Загадка для разработчиков
Что за термин загадан на картинке?
💬 Пишите в комменты ответ под спойлером.
🐸 Библиотека джависта #междусобойчик
Что за термин загадан на картинке?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1🔥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.
Пост Антона Черноусова — это тёплый флешбэк в 2004 год, когда JSR 166 и пакет java.util.concurrent стали для нас настоящим глотком свежего воздуха . Это был не просто набор утилит, а смена парадигмы. Мы получили инструменты, которые решали проблемы на концептуально новом уровне.
Вместо ручного менеджмента потоков пришёл ExecutorService, который позволил думать о задачах, а не о жизненном цикле Thread. Вместо медленного Hashtable или Collections.synchronizedMap мы получили молниеносный ConcurrentHashMap. А вместо хрупких конструкций на wait()/notify() — мощные и понятные синхронизаторы вроде CountDownLatch и CyclicBarrier.
Именно этому и посвящена книга «Java Concurrency на практике». Она стала тем самым мануалом, который не просто описывал API, а учил мыслить в новой парадигме. Для опытных это отличный повод поностальгировать и оценить пройденный путь, а для молодых — понять, почему эти «классические» инструменты до сих пор являются основой большинства многопоточных приложений на Java.
❤6
Хотите создать мощный инструмент мониторинга для ваших микросервисов? Используйте 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
👍4❤2🔥1😁1🥱1