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