Что верно про реализацию паттерна Observer в современной Java?
java.util.Observable устарел с Java 9. Современные формы: ApplicationEventPublisher и @EventListener в Spring, реактивные потоки (Flow, Reactor), брокеры сообщений. Подводные камни: синхронный слушатель делит поток и транзакцию с издателем, неотписанные подписчики текут, порядок вызова не гарантирован.
- @TransactionalEventListener — обработка после коммита
- @Async — вынести слушателя из потока издателя
- Исключение в синхронном слушателе ломает издателя
А ещё Между сервисами — Kafka и outbox вместо событий в памяти
Подробно
Ссылаться на java.util.Observable как на актуальный пример не стоит — он deprecated с Java 9 из-за отсутствия типобезопасности и поддержки конкурентности. Современные воплощения: @EventListener и ApplicationEventPublisher в Spring (плюс @TransactionalEventListener, откладывающий обработку до коммита) и Reactive Streams, где к Observer добавлен backpressure. Ловушки — синхронность по умолчанию, утечки через сильные ссылки на подписчиков и негарантированный порядок.
Что хотят услышать
- Почему Observable устарел.
- Современные реализации.
- Ловушки синхронности и утечек.
Частые ошибки
- Полагаться на порядок вызова слушателей.
- Не учитывать, что исключение в синхронном слушателе поднимется к издателю.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓java.util.Observer и Observable объявлены deprecated начиная с Java 9
- ✗Порядок уведомления подписчиков гарантирован спецификацией, поэтому на него можно смело полагаться
- ✓Синхронный слушатель Spring по умолчанию выполняется в потоке и транзакции издателя, поэтому его исключение может откатить основную операцию
- ✓Подписчики, которых забыли отписать, — классический источник утечки памяти
Что спросят дальше
- Что делает @TransactionalEventListener и зачем он нужен?
- Чем Reactive Streams отличается от классического Observer?
Разбор темы
- Поведенческие паттерны
Strategy, Template Method, Observer, Command, Chain of Responsibility, State, Iterator и Visitor — с примерами из JDK, Spring и заменой паттернов лямбдами и sealed-типами.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.