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

Java 9 вышла, и Observer был объявлен устаревшим Это почему? Значит ли это, что мы больше не должны реализовывать шаблон наблюдателя?

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

6 ответов

Решение

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

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

ДА, это означает, что вы не должны реализовывать Observer а также Obervable больше

Почему они устарели -

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

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

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

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

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

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


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

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

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

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


Это почему?

Есть еще причины:

Not Serializable - поскольку Observable не реализует Serializable. Таким образом, вы не можете Serialize Observable ни его подкласс.

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

Меньше предлагать -

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

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

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


Итак, какая у нас альтернатива?

Ты можешь использовать PropertyChangeEvent а также PropertyChangeListener от java.beans пакет.

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

Ответ: 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 потока.

Проблема заключается в глючных реализациях Java класса / интерфейса Java с именами Observer, Observable и т. Д., Но не с шаблоном GoF Observer.

Также можно использовать CDi 2.0, обработку событий.

Другие вопросы по тегам