Yanıtlar:
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 gelmezObserver
veObervable
artık bu.
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ı , Observer
zayıflığıObservable
olan güzel bir şekilde ön plana çıkarıyor : hepsi aynı . Tabanlı mantığa dayalı instanceof
ve 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 Serializable
vardı.
Buna daha iyi bir alternatif nedir?
Öte yandan Listeners
birç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 PropertyChangeListener
yerine.
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ı
RxJava
veya diğer reaktif akış çerçevelerini kullanırken yanlışlıkla vuruyor . Bu durumda, kullanıcılar normaldejava.util.concurrent.Flow
tü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.
Listener
aynı zamanda bir Gözlemcidir.
Evet, Java 9'da kullanımdan kaldırıldı . Ve artık gözlemci kalıbı uygulayamayız.
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.
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ı.
Sen kullanabilirsiniz PropertyChangeEvent
ve PropertyChangeListener
gelen java.beans
paketin.
PropertyChangeListener
yerine geçer Observer
, bunun yerine neyi genişletmeli / uygulamalıyım Observable
?
PropertyChangeSupport
bir örnek değişken olarak eklemek , ama bir onay için teşekkür ederiz.
Java 9'da Observer neden kullanımdan kaldırıldı?
Ans:Observable
sınıf ve Observer
olay modeli tarafından desteklenen çünkü arayüz Java 9'da kaldırıldıktan Observer
ve Observable
oldukça sınırlıdır tarafından teslim bildirimleri sırası Observable
belirtilmemiş 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ı :
Flow
Bir sınıf Java 9 tanıtılan ve 4 birbiriyle arayüzleri vardır: Processor
, Publisher
, Subscriber
ve 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.Publisher
ve Flow.Subscriber
.
Java belgesine bakın https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html
Observable
Sınıfın ve Observer
arabirimin 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çinjava.util.concurrent
paketteki eşzamanlı veri yapılarından birini kullanmayı düşünün . Reaktif akış tarzı programlama için Akış API'sına bakın.