Наблюдатель устарел в Java 9. Что мы должны использовать вместо этого?


Java 9 вышел, и Observer была прекращена. Почему? Означает ли это, что мы больше не должны реализовывать шаблон наблюдателя?

хорошо бы знать, что является лучшей альтернативой?

4 87

4 ответа:

почему это? Означает ли это, что мы больше не должны реализовывать шаблон наблюдателя?

отвечая на последнюю часть первой -

да, это означает, что вы не должны выполнять Observer и Obervables больше.

почему они были осуждены -

они не предоставили достаточно богатую модель событий для приложений. Например, они могли бы поддержать только идею о том, что что-то изменилось, но не передал никакой информации о том, что изменилось.

Алекс ставит его красиво авансом, что Observer есть слабость: все Observable s такие же. Вы должны реализовать логику, которая основана на instanceof и привести объект к конкретному типу в Observable.update() метод.

чтобы добавить к нему были ошибки, как один не удалось сериализовать Observable класс потому что как он не реализовал Serializable интерфейс и все его члены были частными.

что является лучшей альтернативой что?

С другой стороны Listeners есть много типов, и они имеют методы обратного вызова и не требует литья. Как указал @Ravi в своем ответ можно использовать PropertyChangeListener.

для остальной части его @Deprecation был отмечен соответствующей документацией для изучения других пакетов, связанных в других и ответы тоже.


обратите внимание, что устаревание также было отмечено анализом, как указано в эта почта -

в эти дни любой, кто сталкивается с ними, вероятно, поражает их ошибка при использовании RxJava или другие структуры реактивного потока. В этом случае пользователи обычно хотят использовать jdk9 java.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: управление сообщениями, связывающее a Flow.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 потока.