Ответы:
Это почему? Означает ли это, что нам больше не следует реализовывать шаблон наблюдателя?
Отвечая на последнюю часть первым -
ДА , это означает, что вам больше не следует внедрятьObserver
иObervable
.
Они не предоставили достаточно богатой модели событий для приложений. Например, они могли поддерживать только идею о том, что что-то изменилось, но не передавали никакой информации о том, что изменилось.
Ответ Алекса говорит о том, что у Observer
него есть слабость: все Observable
одинаковы . Вы должны реализовать логику, которая основана на instanceof
и привести объект к конкретному типу в Observable.update()
метод.
Чтобы добавить к этому, были ошибки, такие как невозможно сериализоватьObservable
класс, потому что он не реализовывал Serializable
интерфейс, и все его члены были частными.
Что является лучшей альтернативой этому?
С другой стороны, у Listeners
них много типов, они имеют методы обратного вызова и не требуют приведения. Как указал @Ravi в своем ответе, вы можете использовать PropertyChangeListener
вместо этого.
В остальном он @Deprecation
был отмечен соответствующей документацией для изучения других пакетов, которые также указаны в других ответах.
Обратите внимание, что устаревание также было отмечено анализом, как указано в этом письме -
В наши дни любой, кто сталкивается с ними, вероятно, попадает в них по ошибке при использовании
RxJava
или других фреймворков реактивного потока. В этом случае пользователи обычно хотят вместо этого использоватьjava.util.concurrent.Flow
API-интерфейсы jdk9, чтобы все платформы реактивных потоков были совместимы / совместимы в рамках своих запланированных будущих версий, совместимых с jdk9.
Изменить : также стоит упомянуть, что отказ от API-интерфейсов вызван не только по вышеуказанной причине, но и невозможностью поддерживать такой устаревший код, как упоминалось в комментариях к нескольким отчетам об ошибках (ссылки выше), которые были повышены до тем или иным способом обозначить улучшение в его реализации.
Listener
также наблюдатель.
notifyObservers()
происходят одновременно. Вот кодлет из того же ресурса, который подробно объясняет его функции.
Да, это устарело в Java 9 . И мы больше не можем реализовать шаблон наблюдателя.
Причин больше:
Not Serializable - поскольку Observable не реализует Serializable. Итак, вы не можете сериализовать Observable ни его подкласс.
Нет безопасности потока - методы могут быть переопределены его подклассами, и уведомление о событии может происходить в разных порядках и, возможно, в разных потоках, что достаточно для нарушения любой "безопасности потока".
Они не предоставляют достаточно богатую модель событий для приложений. Например, они поддерживают только идею о том, что что-то изменилось, но не передают никакой информации о том, что изменилось
Открытые проблемы - Как уже упоминалось, было поднято много основных проблем (безопасность потоков, Serializable), и большинство из них имели сложности, которые нужно было исправить, и все еще «не исправлены» или « Нет активной разработки» , и это является причиной, по которой она устарела .
Я также рекомендовал бы прочитать этот ответ. Почему следует исключить шаблон наблюдателя? , @Jeff объяснил другие причины прекращения поддержки.
Вы можете использовать PropertyChangeEvent
и PropertyChangeListener
из java.beans
пакета.
PropertyChangeListener
заменяет Observer
, но что я должен расширить / реализовать вместо Observable
?
PropertyChangeSupport
переменной экземпляра, но я был бы признателен за подтверждение.
Почему Observer устарела в Java 9?
Ans:Observable
класс и Observer
интерфейс был устаревшим в Java 9 , поскольку модель событий поддерживается Observer
и Observable
весьма ограничена, порядок уведомлений доставляетсяObservable
не определен, и изменения состояния не в один-на-однозначном соответствии с уведомлениями.
См. Документ Java на https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html.
Альтернатива паттерну наблюдателя?
Существует множество вариантов шаблона проектирования Observer, и Reactive Streams является одним из них.
Реактивные потоки или API потока :
Flow
является класс введен в Java 9 и имеет 4 взаимосвязанных интерфейсы: Processor
, Publisher
, Subscriber
иSubscription
.
Flow.Processor
: Компонент, который действует как подписчик и как издатель.
Flow.Publisher
: Производитель товаров, полученных подписчиками.
Flow.Subscriber
: Получатель сообщений.
Flow.Subscription
: Контроль сообщений, связывающий а Flow.Publisher
и Flow.Subscriber
.
См. Документ Java https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html
Учитывая, что Observable
класс и Observer
интерфейс были объявлены устаревшими, начиная с Java 9. Согласно посту Java Observer и Observable устарели в JDK 9
Модель событий, поддерживаемая Observer и Observable, довольно ограничена, порядок уведомлений, доставляемых Observable, не определен, а изменения состояния не находятся в однозначном соответствии с уведомлениями. Для более богатой модели событий рассмотрите возможность использования
java.beans
пакета. Для надежного и упорядоченного обмена сообщениями между потоками рассмотрите возможность использования одной из параллельных структур данных вjava.util.concurrent
пакете. Для программирования стиля реактивных потоков см. API потока.