Java 9 вышла, а Observer
устарела. Это почему? Значит ли это, что мы больше не должны реализовывать шаблон наблюдателя?
Было бы хорошо узнать, что является лучшей альтернативой?
Java 9 вышла, а Observer
устарела. Это почему? Значит ли это, что мы больше не должны реализовывать шаблон наблюдателя?
Было бы хорошо узнать, что является лучшей альтернативой?
Это почему? Значит ли это, что мы больше не должны реализовывать шаблон наблюдателя?
Отвечая на последнюю часть первым -
ДА, это означает, что вы больше не должны использовать Observer
и Obervable
.
Они не предоставили достаточно богатую модель событий для приложений. Например, они могли поддерживать только идею о том, что что-то изменилось, но не передавали никакой информации о том, что изменилось.
В ответе Алекса ясно сказано, что у Observer
есть слабость: все Observable
одинаковы. Вы должны реализовать логику, основанную на instanceof
и привести объект к конкретному типу в метод Observable.update()
.
Чтобы добавить к этому, были ошибки, такие как невозможно сериализовать класс Observable
потому что он не реализовывал интерфейс Serializable
и все его члены были частными.
Что является лучшей альтернативой этому?
С другой стороны, у Listeners
много типов, у них есть методы обратного вызова, и они не требуют приведения. Как указал @Ravi в своем ответе, вы можете вместо этого использовать PropertyChangeListener
.
В остальном @Deprecation
был помечен соответствующей документацией для изучения других пакетов, как указано в других ответах.
Обратите внимание, что амортизация была также отмечена анализом, как указано в этом письме -
В наши дни любой, кто сталкивается с ними, вероятно, ударил их по ошибке при использовании
RxJava
или другихRxJava
реактивного потока. В этом случае пользователи обычно захотят вместо этого использовать jdk9java.util.concurrent.Flow
API-интерфейсы, чтобы все структуры реагирующих потоков были совместимы/совместимы в своих запланированных будущих версиях, совместимых с jdk9.
Редактировать: Стоит также упомянуть, что устаревание API связано не только с вышеуказанной причиной, но и с невозможностью поддерживать такой устаревший код, как упомянуто в комментариях к нескольким отчетам об ошибках (см. Выше), которые были подняты для отметить улучшение его реализации тем или иным способом.
Да, он устарел в Java 9. И мы больше не можем реализовать шаблон наблюдателя.
Есть больше причин:
Not Serializable. Поскольку Observable не реализует Serializable. Таким образом, вы не можете Serialize Observable ни его подкласс.
No Thread Safety. Методы могут быть переопределены его подклассами, а уведомление о событиях может происходить в разных порядках и, возможно, на разные потоки, которых достаточно, чтобы нарушить любую "безопасность потока".
Они не обеспечивают достаточно богатую модель событий для приложений. Для Например, они поддерживают только представление о том, что что-то изменилось, но они не передают никакой информации о том, что изменилось
Открытые проблемы. Как уже упоминалось, было много серьезных проблем (безопасность потоков, 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 потока.