Pengamat sudah usang di Java 9. Apa yang harus kita gunakan sebagai ganti?

133

Java 9 keluar, dan Observertelah usang. Mengapa demikian? Apakah ini berarti bahwa kita seharusnya tidak menerapkan pola pengamat lagi?

Akan lebih baik untuk mengetahui apa alternatif yang lebih baik?

penasaran95
sumber

Jawaban:

104

Mengapa demikian? Apakah ini berarti bahwa kita seharusnya tidak menerapkan pola pengamat lagi?

Menjawab bagian terakhir terlebih dahulu -

YA , itu berarti Anda tidak boleh menerapkanObserverdanObervablelagi.

Mengapa mereka ditinggalkan -

Mereka tidak menyediakan model acara yang cukup kaya untuk aplikasi. Misalnya, mereka hanya dapat mendukung gagasan bahwa sesuatu telah berubah, tetapi tidak menyampaikan informasi apa pun tentang apa yang telah berubah.

Jawaban Alex menempatkannya dengan baik di muka yang Observermemiliki kelemahan: semua Observablesama . Anda harus mengimplementasikan logika yang didasarkan pada instanceofdan melemparkan objek ke tipe beton ke dalam Observable.update()metode.

Untuk menambahkannya ada bug seperti orang tidak bisa membuat serialObservable kelas karena tidak mengimplementasikan Serializableantarmuka dan semua anggotanya pribadi.

Apa alternatif yang lebih baik untuk itu?

Di sisi lain Listenersada banyak jenis dan mereka memiliki metode panggilan balik dan tidak memerlukan casting. Seperti yang ditunjukkan oleh @Ravi dalam jawabannya, Anda bisa memanfaatkannya PropertyChangeListener.

Selebihnya, @Deprecationtelah ditandai dengan dokumentasi yang tepat untuk mengeksplorasi paket-paket lain yang terhubung dengan jawaban lain juga.


Perhatikan bahwa penghentian itu juga ditandai dengan analisis sebagaimana dinyatakan dalam surat ini -

Saat ini, siapa pun yang mengalami hal ini mungkin secara tidak sengaja memukul mereka saat menggunakan RxJavakerangka kerja aliran reaktif lainnya. Dalam hal ini, pengguna biasanya ingin menggunakan java.util.concurrent.FlowAPI jdk9 yang semua kerangka kerja reaktif-stream harus kompatibel / interoperable dalam versi mendatang yang kompatibel dengan jdk9 yang direncanakan.

Sunting : Perlu juga disebutkan bahwa penghentian API bukan hanya semata-mata karena alasan di atas, tetapi juga tidak dapat mempertahankan kode warisan seperti yang disebutkan dalam komentar dari beberapa laporan bug (ditautkan di atas) yang dinaikkan ke tandai peningkatan dalam implementasinya dengan satu atau lain cara.

Naman
sumber
3
+1. Jawaban yang bagus, meskipun saya masih berusaha memahaminya. Apakah Pengamat di Java sudah usang karena beberapa masalah yang melekat pada pola desain itu sendiri (seperti yang didefinisikan dalam buku oleh GOF) atau masalah dukungan untuk pola oleh Java? Dalam bahasa OO lainnya, seperti C #, C ++, Python, apakah pola desain pengamat juga memiliki masalah yang sama seperti di Jawa?
Tim
25
Fakta bahwa implementasi tertentu sudah usang tidak berarti bahwa pola Pengamat cacat fatal. Listenerjuga merupakan Pengamat.
chrylis -cautiouslyoptimistic-
@chrylis Terima kasih, tidak bisa setuju lebih, salah satu alasan utama untuk tidak lagi menggunakan API adalah pemeliharaan yang melekat padanya dan bahwa mengubah implementasinya bisa saja melanggar kode lain.
Naman
@ curious95 Tidak dapat memahami cara memberitahukan bersamaan di sana.
Naman
4
@ curious95 Ya, panggilan notifyObservers()bersamaan. Ini adalah codelet dari shared yang sama untuk menjelaskan fungsinya secara detail.
Naman
37

Ya, itu sudah usang di Jawa 9 . Dan, kita tidak bisa menerapkan pola pengamat lagi.


Mengapa demikian?

Ada lebih banyak alasan:

Not Serializable - Karena, Observable tidak mengimplementasikan Serializable. Jadi, Anda tidak dapat Serialize Diamati subkelasnya.

Tanpa Keamanan Utas - Metode dapat ditimpa oleh subkelasnya, dan pemberitahuan acara dapat terjadi dalam urutan berbeda dan mungkin pada utas berbeda, yang cukup untuk mengganggu "keselamatan utas" apa pun.

Kurang untuk menawarkan -

Mereka tidak menyediakan model acara yang cukup kaya untuk aplikasi. Misalnya, mereka hanya mendukung gagasan bahwa sesuatu telah berubah, tetapi mereka tidak menyampaikan informasi apa pun tentang apa yang telah berubah

Masalah Terbuka - Seperti yang disebutkan, ada banyak masalah besar yang diangkat (keselamatan ulir, Serializable) dan kebanyakan dari mereka memiliki kompleksitas untuk diperbaiki dan masih "tidak diperbaiki" atau Tidak Ada Pengembangan Aktif , dan itulah alasan mengapa itu telah ditinggalkan .

Saya juga merekomendasikan untuk membaca jawaban ini. Mengapa pola pengamat harus ditinggalkan? , @Jeff telah menjelaskan alasan penghentian lainnya.


Jadi, apa alternatif yang kita miliki?

Anda dapat menggunakan PropertyChangeEventdan PropertyChangeListenerdari java.beanspaket.

Ravi
sumber
PropertyChangeListenermenggantikan Observer, tetapi apa yang harus saya perpanjang / terapkan di tempat Observable?
LastStar007
Pembaruan: Saya pikir pendekatannya adalah menambahkan PropertyChangeSupportvariabel sebagai instance, tetapi saya akan menghargai konfirmasi.
LastStar007
3
@ LastStar007 Saya pikir Anda benar. Saya menemukan contoh kode di Baeldung.com yang melakukan hal itu.
Dragos Stanciu
13

Mengapa Pengamat sudah usang di Java 9?

Ans: The Observablekelas dan Observerantarmuka telah usang di Jawa 9 karena model acara yang didukung oleh Observerdan Observablesangat terbatas, urutan pemberitahuan yang disampaikan oleh Observableyang tidak ditentukan, dan perubahan negara tidak dalam satu-untuk-satu korespondensi dengan pemberitahuan.

Lihat Java doc https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html

Alternatif pola pengamat?

Ada banyak alternatif pola desain Pengamat dan Reactive Streams adalah salah satunya.

API Aliran atau Aliran Reaktif :

Flowadalah kelas diperkenalkan di Jawa 9 dan memiliki 4 interface yang saling terkait: Processor, Publisher, Subscriberdan Subscription.

Flow.Processor : Komponen yang bertindak sebagai Pelanggan dan Penerbit.

Flow.Publisher : Produser barang yang diterima oleh Pelanggan.

Flow.Subscriber : Penerima pesan.

Flow.Subscription: Tautan kendali pesan a Flow.Publisherdan Flow.Subscriber.

Lihat Java doc https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html

Mohit Tyagi
sumber
7

Menimbang bahwa Observablekelas dan Observerantarmuka telah usang pada Java 9. Sesuai pos , Pengamat dan Yang Dapat Diamati Java Tidak Digunakan dalam JDK 9

Model acara yang didukung oleh Observer dan Observable sangat terbatas, urutan pemberitahuan yang disampaikan oleh Observable tidak ditentukan, dan perubahan status tidak dalam korespondensi satu-satu dengan pemberitahuan. Untuk model acara yang lebih kaya, pertimbangkan untuk menggunakan java.beans paket. Untuk pengiriman pesan yang andal dan teratur di antara utas, pertimbangkan untuk menggunakan salah satu struktur data bersamaan dalam java.util.concurrentpaket. Untuk pemrograman aliran gaya reaktif, lihat API Aliran.

Ousmane D.
sumber