Наблюдатель устарел в Java 9. Что мы должны использовать вместо него?
Java 9 вышел, и Observer
была прекращена.
Почему так? Означает ли это, что мы больше не должны реализовывать шаблон наблюдателя?
было бы неплохо узнать, что является лучшей альтернативой?
4 ответов
почему это? Означает ли это, что мы больше не должны реализовывать шаблон наблюдателя?
отвечая на последнюю часть первой -
да, это означает, что вы не должны выполнять Observer
и Obervable
s больше.
они не предоставили достаточно богатую модель событий для приложений. Например, они могли бы поддержать только идею о том, что что-то изменилось, но не передают никакой информации о том, что изменилось.
Алекс ставит его красиво вперед, что Observer
есть слабость: все Observable
s-это то же самое. Вы должны реализовать логику, которая основана на instanceof
и привести объект к конкретному типу в Observable.update()
метод.
чтобы добавить к нему были ошибки, как один не удалось сериализовать Observable
класс, потому что он не реализовал Serializable
интерфейс и все его члены были частными.
что является лучшей альтернативой что?
С другой стороны Listeners
имеют много типов, и они имеют методы обратного вызова и не требуют кастинга. Как указал @Ravi в своем ответ можно использовать PropertyChangeListener
.
для остального @Deprecation
был отмечен надлежащей документацией для изучения других пакетов, связанных с другими и ответы тоже.
обратите внимание, что устаревание также было отмечено анализом, как указано в эта почта -
в эти дни, кто сталкивается с этим, похоже, их ошибка при использовании
RxJava
или другие рамки реактивного потока. В этом случае пользователи обычно хотят использовать jdk9java.util.concurrent.Flow
API, которые все фреймворки реактивных потоков должно быть совместимо / совместимо в пределах их запланированного предстоящий jdk9-совместимые версии.
редактировать: его также стоит упомянуть, что устаревание API не только из-за вышеуказанной причины, но и неспособность поддерживать такой устаревший код, как упоминалось в комментариях нескольких отчетов об ошибках(связанных выше), которые были подняты, чтобы отметить улучшение его реализации тем или иным способом.
Да, это устарело в Java 9. И мы больше не можем реализовать шаблон наблюдателя.
почему это?
есть и другие причины:
Не Сериализуемый - поскольку Observable не реализует сериализуемый. Таким образом, Вы не можете сериализовать Observable ни его подкласс.
Отсутствие Безопасности Потока - эти методы могут быть переопределены его подклассы и уведомления о событиях могут происходить в разных порядках и, возможно, в разных потоках, чего достаточно, чтобы нарушить любую "безопасность потоков".
Они не обеспечивают достаточно богатую модель событий для приложений. Для например, они поддерживают только представление о том, что что-то изменилось, но они не передают никакой информации о том, что изменилось
Открытые Вопросы - Как уже упоминалось, было много основных проблем (безопасность потоков, Сериализуемая), и большинство из них имели сложности для исправления и все еще "не исправлены" или Нет Активного Развития, и именно по этой причине это было устаревший.
Я бы также рекомендовал прочитать этот ответ почему шаблон наблюдателя должен быть устаревшим?, @Jeff объяснил другие причины для осуждения.
Итак, какова альтернатива, которую мы имеем ?
можно использовать PropertyChangeEvent
и PropertyChangeListener
С java.beans
пакета.
почему Observer устарел в Java 9?
Ans: на Observable
класс а Observer
интерфейс был устаревшим в Java 9, потому что модель событий поддерживается Observer
и Observable
довольно ограничен, порядок уведомлений, доставляемых Observable
Не указано, и изменения состояния не находятся в переписке один к одному с уведомлениями.
см. документ Java https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html
альтернатива шаблона наблюдателя?
существует много альтернатив шаблона проектирования наблюдателя, и реактивные потоки являются одним из них.
реактивные потоки или API потока:
Flow
- класс, введенный в Java 9 и имеющий 4 взаимосвязанных интерфейса:Processor
, Publisher
, Subscriber
и Subscription
.
Flow.Processor
: компонент, который действует как подписчик, так и издатель.
Flow.Publisher
: производитель товаров, полученных подписчиками.
Flow.Subscriber
: приемник сообщений.
Flow.Subscription
: управление сообщениями, связывающее Flow.Publisher
и Flow.Subscriber
.
см. Java doc https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html
учитывая, что Observable
класс а Observer
интерфейс был устаревшим с Java 9. Согласно сообщению наблюдатель Java и наблюдаемый устарели в JDK 9
модель событий, поддерживаемая Observer и Observable, довольно ограничена, порядок уведомлений, предоставляемых Observable, не определен, и изменения состояния не находятся в однозначном соответствии с уведомления. Для более богатой модели событий рассмотрите возможность использования
java.beans
пакет. Для надежного и упорядоченного обмена сообщениями между потоками рассмотрите использование одной из параллельных структур данных вjava.util.concurrent
пакета. Для программирования стиля реактивных потоков см. API потока.