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 потока.