Observer устарел в Java 9. Что мы должны использовать вместо него?
Java 9 вышла, и Observer
был объявлен устаревшим Это почему? Значит ли это, что мы больше не должны реализовывать шаблон наблюдателя?
Было бы хорошо узнать, что является лучшей альтернативой?
6 ответов
Это почему? Значит ли это, что мы больше не должны реализовывать шаблон наблюдателя?
Отвечая на последнюю часть первым -
ДА, это означает, что вы не должны реализовывать Observer
а также Obervable
больше
Они не предоставили достаточно богатую модель событий для приложений. Например, они могли поддерживать только идею о том, что что-то изменилось, но не передавали никакой информации о том, что изменилось.
Ответ Алекса говорит о том, что Observer
имеет слабость: все Observable
с одинаковы. Вы должны реализовать логику, которая основана на instanceof
и бросить объект в конкретный тип в Observable.update()
метод.
Чтобы добавить к этому, были ошибки, такие как невозможно сериализовать Observable
класс, потому что, как он не реализовал Serializable
интерфейс и все его члены были частными.
Что является лучшей альтернативой этому?
С другой стороны Listeners
имеют много типов, и они имеют методы обратного вызова и не требуют приведения. Как отметил @Ravi в своем ответе, вы можете использовать PropertyChangeListener
вместо.
В остальном @Deprecation
была отмечена соответствующей документацией для изучения других пакетов, как указано в других ответах.
Обратите внимание, что амортизация также была отмечена анализом, как указано в этом письме -
В наши дни любой, кто сталкивается с этим, вероятно, бьет их по ошибке при использовании
RxJava
или другие структуры реактивного потока. В этом случае пользователи обычно хотят вместо этого использовать JDK9java.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.