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