Відповіді:
Чому так? Чи означає це, що ми більше не повинні реалізовувати модель спостерігачів?
Відповідаючи на останню частину першим -
ТАК , це означає, що ви більше не повинні реалізовуватиObserver
івиконувати їїObervable
.
Вони не запропонували достатньо насиченої моделі подій для додатків. Наприклад, вони могли підтримати лише те, що щось змінилося, але не передали жодної інформації про те, що змінилося.
У відповіді Алекса видно, що в Observer
нього є слабкість: всі Observable
s однакові . Вам належить реалізувати логіку, що ґрунтується на instanceof
та передати об'єкт конкретному типу в Observable.update()
метод.
Щоб додати до нього, були помилки, як один не міг серіалізуватиObservable
клас, оскільки він не реалізував Serializable
інтерфейс, і всі його члени були приватними.
Яка краща альтернатива цьому?
З іншого боку Listeners
, існує маса типів, вони мають методи зворотного виклику і не потребують кастингу. Як вказує @Ravi у своїй відповіді, ви можете скористатися PropertyChangeListener
натомість.
Для решти він @Deprecation
був позначений належною документацією для вивчення інших пакетів, як це пов'язано в інших відповідях.
Зауважте, що депресія також була позначена аналізом, зазначеним у цьому листі -
Сьогодні хтось із цими, хто стикається з ними, напевно, потрапляє на них помилково під час використання
RxJava
чи інших реактивних потокових рамок. У такому випадку користувачі, як правило, захочуть використовуватиjava.util.concurrent.Flow
API jdk9, щоб усі рамки реактивних потоків повинні бути сумісними / сумісними у своїх запланованих майбутніх версіях, сумісних з jdk9.
Редагувати : Варто також зазначити, що припинення API не є головним чином лише з вищезазначеної причини, але також неможливо зберегти такий застарілий код, як згадується в коментарях до кількох звітів про помилки (пов'язані вище), які були порушені відзначити покращення в його здійсненні тим чи іншим способом.
Listener
є також Спостерігачем.
Так, це застаріло в Java 9 . І ми більше не можемо реалізувати схему спостерігачів.
Є більше причин:
Не серіалізується - оскільки, спостерігається не реалізує серіалізабельність. Отже, ви не можете серіалізувати спостерігається ні його підклас.
Без безпеки потоку - Методи можуть бути замінені її підкласами, а сповіщення про події може відбуватися в різних порядках і, можливо, в різних потоках, що достатньо, щоб порушити будь-яку "безпеку потоку".
Вони не забезпечують достатньо багату модель подій для додатків. Наприклад, вони підтримують лише те, що щось змінилося, але вони не передають жодної інформації про те, що змінилося
Відкриті проблеми - Як уже згадувалося, було порушено безліч основних питань (безпека потоку, Serializable), і більшість із них мали складності виправити і досі «не виправлено» або немає активного розвитку , і саме тому це було застаріло .
Я також рекомендував би прочитати цю відповідь Чому слід спостерігати за тим, щоб модель спостерігачів була застарілою? , @Jeff пояснив інші причини знецінення.
Можна використовувати PropertyChangeEvent
і PropertyChangeListener
з java.beans
пакета.
PropertyChangeListener
замінює Observer
, але що мені слід розширити / впровадити замість Observable
?
PropertyChangeSupport
змінну екземпляра, але я вдячний підтвердження.
Чому Observer застарілий у Java 9?
Ans:Observable
клас і Observer
інтерфейс був застарілим в Java 9 , оскільки модель подій підтримується Observer
і Observable
вельми обмежений, порядок повідомлень доставляються Observable
не визначений, і зміни стану не в один-на-однозначним дотриманням повідомленнями.
Дивіться сторінку Java doc https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html
Альтернатива шаблону спостерігача?
Існує багато альтернатив структури дизайну Observer, і Реактивні потоки є однією з них.
API реактивних потоків або потоку :
Flow
є клас введений в Java 9 і має 4 взаємопов'язані інтерфейси: Processor
, Publisher
, Subscriber
і Subscription
.
Flow.Processor
: Компонент, який виступає і передплатником, і видавцем.
Flow.Publisher
: Виробник предметів, отриманих Абонентами.
Flow.Subscriber
: Приймач повідомлень.
Flow.Subscription
: Управління повідомленнями, що посилаються на a 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 Flow.