Gözlemci Java 9'da kullanımdan kaldırıldı. Bunun yerine ne kullanmalıyız?


Yanıtlar:


104

Neden? Bu artık gözlemci kalıbı uygulamamamız gerektiği anlamına mı geliyor?

Önce ikinci kısmı cevaplamak -

EVET , bu uygulamaması gerektiği anlamına gelmezObserverveObervableartık bu.

Neden reddedildiler -

Uygulamalar için yeterince zengin bir etkinlik modeli sağlamadılar. Örneğin, yalnızca bir şeyin değiştiği fikrini destekleyebildiler, ancak neyin değiştiği hakkında herhangi bir bilgi iletmediler.

Alex'in cevabı , ObserverzayıflığıObservable olan güzel bir şekilde ön plana çıkarıyor : hepsi aynı . Tabanlı mantığa dayalı instanceofve nesneyi somut tipte Observable.update()metoda dökmelisiniz.

Eklemek için, arabirimi uygulamadığı ve tüm üyelerinin özel olduğu içinObservable sınıfın serileştirilememesi gibi hatalar Serializablevardı.

Buna daha iyi bir alternatif nedir?

Öte yandan Listenersbirçok türü vardır ve geri çağrı yöntemleri vardır ve döküm gerektirmez. Onun içinde @Ravi tarafından belirttiği gibi cevap size yararlanabilir PropertyChangeListeneryerine.

Geri kalanı için @Deprecation, diğer yanıtlarda da olduğu gibi diğer paketleri keşfetmek için uygun belgelerle işaretlenmiştir.


Belirtilen kullanımdan kaldırılması da bir analiz ile kutlandı unutmayın bu posta -

Bu günlerde, bunlarla karşılaşan herkes muhtemelen bunları RxJavaveya diğer reaktif akış çerçevelerini kullanırken yanlışlıkla vuruyor . Bu durumda, kullanıcılar normalde java.util.concurrent.Flowtüm reaktif akış çerçevelerinin planlanan yaklaşan jdk9 uyumlu sürümlerinde uyumlu / birlikte çalışabilir olması gereken jdk9 API'lerini kullanmak isteyecektir .

Düzenleme : Ayrıca API'ların kullanımdan kaldırılmasının öncelikle yukarıdaki nedenden ötürü değil, aynı zamanda yükseltilmiş olan hata raporlarının (yukarıda bağlantılı) birkaçının yorumlarında belirtildiği gibi eski kodu koruyamayacağını da belirtmek gerekir. bir ya da başka bir yolla uygulamasında bir gelişmeyi işaretlemek.


3
+1. İyi cevap, yine de anlamaya çalışıyorum. Java'daki Gözlemci, tasarım deseninin kendisinde bazı doğal sorunlar (GOF tarafından kitapta tanımlandığı gibi) veya Java tarafından desen desteğinin sorunu nedeniyle kullanımdan kaldırıldı mı? C #, C ++, Python gibi diğer OO dillerinde gözlemci tasarım deseni de Java ile aynı soruna sahip mi?
Tim

25
Belirli bir uygulamanın onaylanmamış olması, Gözlemci modelinin ölümcül bir şekilde kusurlu olduğu anlamına gelmez . Listeneraynı zamanda bir Gözlemcidir.
chrylis -cautiouslyoptimistic-

@chrylis Teşekkürler, daha fazla anlaşamadım, API'yı kullanım dışı bırakmanın ana nedenlerinden biri de ona bağlı bakım ve uygulamanın değiştirilmesinin diğer kodu ihlal ediyor olabileceğidir.
Naman

@ curious95 Orada eşzamanlı bildirim yolunu anlayamıyorum .
Naman

4
@ curious95 Evet arama notifyObservers()eşzamanlı. İşte aynı paylaşılan bir codelet işlevselliğini ayrıntılı olarak açıklamak için.
Naman

37

Evet, Java 9'da kullanımdan kaldırıldı . Ve artık gözlemci kalıbı uygulayamayız.


Neden?

Daha fazla neden var:

Serializable değil - Çünkü, Observable Serializable uygulamaz. Bu nedenle, ne alt sınıfını ne de Gözlenebilir'i Serialize edemezsiniz.

İş Parçacığı Güvenliği Yok - Yöntemler, alt sınıfları tarafından geçersiz kılınabilir ve olay bildirimi, farklı siparişlerde ve muhtemelen farklı iş parçacıklarında gerçekleşebilir; bu, herhangi bir "iş parçacığı güvenliğini" kesmek için yeterlidir.

Daha az teklif -

Uygulamalar için yeterince zengin bir etkinlik modeli sağlamazlar. Örneğin, yalnızca bir şeyin değiştiği fikrini desteklerler, ancak neyin değiştiği hakkında herhangi bir bilgi aktarmazlar

Açık Konular - Daha önce de belirtildiği gibi, gündeme getirilen pek çok önemli sorun vardı (iş parçacığı güvenliği, Serileştirilebilir) ve çoğunun düzeltilmesi ve hala "düzeltilmemiş" veya Aktif Gelişme Olmaması gibi karmaşıklıkları vardı ve bu nedenle kullanımdan kaldırıldı .

Ayrıca bu cevabı okumanızı tavsiye ederim. Gözlemci model neden kullanımdan kaldırılmalıdır? , @Jeff, kullanımdan kaldırmanın diğer nedenlerini açıkladı.


Peki, sahip olduğumuz alternatif nedir?

Sen kullanabilirsiniz PropertyChangeEventve PropertyChangeListenergelen java.beanspaketin.


PropertyChangeListeneryerine geçer Observer, bunun yerine neyi genişletmeli / uygulamalıyım Observable?
LastStar007

Güncelleme: Bence yaklaşım PropertyChangeSupportbir örnek değişken olarak eklemek , ama bir onay için teşekkür ederiz.
LastStar007

3
@ LastStar007 Doğru olduğunu düşünüyorum. Baeldung.com sadece bunu yapan bir kod örneği buldum .
Dragos Stanciu

13

Java 9'da Observer neden kullanımdan kaldırıldı?

Ans:Observable sınıf ve Observerolay modeli tarafından desteklenen çünkü arayüz Java 9'da kaldırıldıktan Observerve Observableoldukça sınırlıdır tarafından teslim bildirimleri sırası Observablebelirtilmemiş olup, durum değişiklikleri bildirimleri ile bire-bir tekabül değildir.

Java belgesine bakın https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html

Gözlemci modelinin alternatifi mi?

Gözlemci tasarım modelinin birçok alternatifi vardır ve Reaktif Akımlar bunlardan biridir.

Reaktif Akışlar veya Akış API'sı :

FlowBir sınıf Java 9 tanıtılan ve 4 birbiriyle arayüzleri vardır: Processor, Publisher, Subscriberve Subscription.

Flow.Processor : Hem Abone hem de Yayıncı görevi gören bir bileşen.

Flow.Publisher : Aboneler tarafından alınan öğelerin üreticisi.

Flow.Subscriber : Mesaj alıcısı.

Flow.Subscription: A Flow.Publisherve Flow.Subscriber.

Java belgesine bakın https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html


7

ObservableSınıfın ve Observerarabirimin Java 9'dan itibaren kullanımdan kaldırıldığı düşünüldüğünde, JDK 9'da Java'nın Gözlemcisi ve Gözlenebilir'i kullanımdan kaldırılmıştır

Gözlemci ve Gözlemlenebilir tarafından desteklenen olay modeli oldukça sınırlıdır, Gözlemlenebilir tarafından gönderilen bildirimlerin sırası belirtilmemiştir ve durum değişiklikleri bildirimlerle birebir yazışmalarda değildir. Daha zengin bir etkinlik modeli için java.beans paketi kullanmayı düşünün . İleti dizileri arasında güvenilir ve düzenli mesajlaşma için java.util.concurrentpaketteki eşzamanlı veri yapılarından birini kullanmayı düşünün . Reaktif akış tarzı programlama için Akış API'sına bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.