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