Получить доступ

Что верно про реализацию паттерна Observer в современной Java?

MiddleПаттерны проектирования
Коротко

java.util.Observable устарел с Java 9. Современные формы: ApplicationEventPublisher и @EventListener в Spring, реактивные потоки (Flow, Reactor), брокеры сообщений. Подводные камни: синхронный слушатель делит поток и транзакцию с издателем, неотписанные подписчики текут, порядок вызова не гарантирован.

  • @TransactionalEventListener — обработка после коммита
  • @Async — вынести слушателя из потока издателя
  • Исключение в синхронном слушателе ломает издателя

А ещё Между сервисами — Kafka и outbox вместо событий в памяти

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Ссылаться на 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?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем