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

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

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

4 ответов


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

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

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

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

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

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

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

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

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

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


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

в эти дни, кто сталкивается с этим, похоже, их ошибка при использовании RxJava или другие рамки реактивного потока. В этом случае пользователи обычно хотят использовать jdk9 java.util.concurrent.Flow API, которые все фреймворки реактивных потоков должно быть совместимо / совместимо в пределах их запланированного предстоящий jdk9-совместимые версии.

редактировать: его также стоит упомянуть, что устаревание API не только из-за вышеуказанной причины, но и неспособность поддерживать такой устаревший код, как упоминалось в комментариях нескольких отчетов об ошибках(связанных выше), которые были подняты, чтобы отметить улучшение его реализации тем или иным способом.


Да, это устарело в Java 9. И мы больше не можем реализовать шаблон наблюдателя.


почему это?

есть и другие причины:

Не Сериализуемый - поскольку Observable не реализует сериализуемый. Таким образом, Вы не можете сериализовать Observable ни его подкласс.

Отсутствие Безопасности Потока - эти методы могут быть переопределены его подклассы и уведомления о событиях могут происходить в разных порядках и, возможно, в разных потоках, чего достаточно, чтобы нарушить любую "безопасность потоков".

меньше предложение -

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

Открытые Вопросы - Как уже упоминалось, было много основных проблем (безопасность потоков, Сериализуемая), и большинство из них имели сложности для исправления и все еще "не исправлены" или Нет Активного Развития, и именно по этой причине это было устаревший.

Я бы также рекомендовал прочитать этот ответ почему шаблон наблюдателя должен быть устаревшим?, @Jeff объяснил другие причины для осуждения.


Итак, какова альтернатива, которую мы имеем ?

можно использовать PropertyChangeEvent и PropertyChangeListener С java.beans пакета.


почему Observer устарел в Java 9?

Ans: на Observable класс а Observer интерфейс был устаревшим в Java 9, потому что модель событий поддерживается Observer и Observable довольно ограничен, порядок уведомлений, доставляемых Observable Не указано, и изменения состояния не находятся в переписке один к одному с уведомлениями.

см. документ Java 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: управление сообщениями, связывающее 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

модель событий, поддерживаемая Observer и Observable, довольно ограничена, порядок уведомлений, предоставляемых Observable, не определен, и изменения состояния не находятся в однозначном соответствии с уведомления. Для более богатой модели событий рассмотрите возможность использования java.beans пакет. Для надежного и упорядоченного обмена сообщениями между потоками рассмотрите использование одной из параллельных структур данных в java.util.concurrent пакета. Для программирования стиля реактивных потоков см. API потока.