Подтвердить что ты не робот

Альтернатива классу Java Observable?

Я прихожу на Java из мира С#, где шаблон Observer реализован в качестве первоклассной языковой конструкции с ключевым словом event.

Я вижу, что Java имел класс Observable с первых дней, но он явно имеет проблемы с реализацией и, похоже, не широко используется. До сих пор я только что выполнял реализацию шаблона Observer в своем Java-коде, но я всегда не могу не думать, что должна быть лучшая альтернатива всегда выставлять этот шаблонный код. В Swing есть классы Listener, но они не подходят для кода без Swing.

Какое рекомендуемое решение для этой общей проблемы? Сторонние библиотеки все в порядке со мной.

4b9b3361

Ответ 1

Обычно шаблон наблюдателя реализуется специальным решением, когда это необходимо. Когда дело доходит до поведенческих моделей, это один из самых простых: два метода для управления списком "наблюдателей" и один метод, который уведомляет наблюдателей, когда происходит что-то интересное.

Шаблон наблюдателя имеет тенденцию возникать слишком редко за пределами определенных доменов, и когда он возникает, он имеет тенденцию быть слишком специфичным для области приложения, поэтому общие решения не имеют большого значения. Вы можете увидеть проблему с классом java.util.Observable: если вы наследуете от Observable, вы должны принять всевозможные "наблюдатели", которые могут быть переданы вам, что, вероятно, не имеет смысла для вашего приложения:

  • Что делать, если ваш объект может создавать два разных типа событий и, следовательно, нуждается в двух разных списках наблюдателей?
  • Что делать, если наблюдатели могут влиять на ваш объект в зависимости от события, например. путем наложения вето на изменение?

Тем не менее, EventBus из Google Guava, похоже, делает довольно хорошую работу по упрощению создания и обработки событий, применяя радикально иной подход.

Другие методы основанные на аннотациях, обсуждались ранее в SO.

Ответ 2

В этой статье показана хорошая реализация шаблона с использованием Spring Framework. Вам по-прежнему необходимо определить интерфейсы Subject и Observer (и реализации), но Spring обрабатывает регистрацию Observer для объектов через конфигурацию XML.