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

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

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


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

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

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

Ответ 2

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


Почему это?

Есть больше причин:

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

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

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

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

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

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


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

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

Ответ 3

Почему 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.

Ответ 4

Учитывая, что класс Observable и интерфейс Observer устарели, начиная с Java 9. Согласно посту Java Observer и Observable устарели в JDK 9

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