Ответы:
Это почему? Означает ли это, что нам больше не следует реализовывать шаблон наблюдателя?
Отвечая на последнюю часть первым -
ДА , это означает, что вам больше не следует внедрятьObserverиObervable.
Они не предоставили достаточно богатой модели событий для приложений. Например, они могли поддерживать только идею о том, что что-то изменилось, но не передавали никакой информации о том, что изменилось.
Ответ Алекса говорит о том, что у Observerнего есть слабость: все Observableодинаковы . Вы должны реализовать логику, которая основана на instanceofи привести объект к конкретному типу в Observable.update()метод.
Чтобы добавить к этому, были ошибки, такие как невозможно сериализоватьObservable класс, потому что он не реализовывал Serializableинтерфейс, и все его члены были частными.
Что является лучшей альтернативой этому?
С другой стороны, у Listenersних много типов, они имеют методы обратного вызова и не требуют приведения. Как указал @Ravi в своем ответе, вы можете использовать PropertyChangeListener вместо этого.
В остальном он @Deprecationбыл отмечен соответствующей документацией для изучения других пакетов, которые также указаны в других ответах.
Обратите внимание, что устаревание также было отмечено анализом, как указано в этом письме -
В наши дни любой, кто сталкивается с ними, вероятно, попадает в них по ошибке при использовании
RxJavaили других фреймворков реактивного потока. В этом случае пользователи обычно хотят вместо этого использоватьjava.util.concurrent.FlowAPI-интерфейсы 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 потока.