Câu trả lời:
Tại sao vậy? Có nghĩa là chúng ta không nên thực hiện mô hình quan sát nữa?
Trả lời phần sau trước -
CÓ , điều đó có nghĩa là bạn không nên thực hiệnObservervàObervables nữa.
Tại sao họ không được tán thành -
Họ đã không cung cấp một mô hình sự kiện đủ phong phú cho các ứng dụng. Ví dụ, họ chỉ có thể hỗ trợ khái niệm rằng một cái gì đó đã thay đổi, nhưng không truyền đạt bất kỳ thông tin nào về những gì đã thay đổi.
Câu trả lời của Alex đưa ra câu trả lời độc đáo Observercó một điểm yếu: tất cả Observableđều giống nhau . Bạn phải triển khai logic dựa trên instanceofvà chuyển đối tượng thành kiểu cụ thể thành Observable.update()phương thức.
Để thêm vào đó, có một số lỗi như người ta không thể tuần tự hóaObservable lớp vì nó không triển khai Serializablegiao diện và tất cả các thành viên của nó là riêng tư.
Một thay thế tốt hơn cho điều đó là gì?
Mặt khác, Listenerscó rất nhiều loại và chúng có phương thức gọi lại và không yêu cầu truyền. Như được chỉ ra bởi @Ravi trong câu trả lời của anh ấy, bạn có thể sử dụng PropertyChangeListenerthay thế.
Đối với phần còn lại của nó, nó @Deprecationđã được đánh dấu bằng tài liệu thích hợp để khám phá các gói khác như được liên kết trong các câu trả lời khác.
Lưu ý rằng sự phản đối cũng được đánh dấu bằng một phân tích như được nêu trong thư này -
Ngày nay, bất cứ ai gặp phải những điều này đều có thể đánh nhầm họ trong khi sử dụng
RxJavahoặc các khung luồng phản ứng khác. Trong trường hợp đó, người dùng thường muốn sử dụngjava.util.concurrent.FlowAPI jdk9 mà tất cả các khung luồng phản ứng phải tương thích / tương thích trong các phiên bản tương thích jdk9 sắp tới của họ.
Chỉnh sửa : Điều đáng nói là sự phản đối của các API không chỉ chủ yếu vì lý do trên mà còn không thể duy trì mã kế thừa như đã đề cập trong các nhận xét về một số báo cáo lỗi (được liên kết ở trên) đánh dấu một sự cải tiến trong việc thực hiện nó theo cách này hay cách khác.
Listenercũng là một Người quan sát.
Vâng, nó không được dùng trong Java 9 . Và, chúng ta không thể thực hiện mô hình quan sát nữa.
Có nhiều lý do:
Không tuần tự hóa - Vì, Observable không thực hiện Nối tiếp. Vì vậy, bạn không thể tuần tự hóa có thể quan sát được cả lớp con của nó.
Không an toàn luồng - Các phương thức có thể bị ghi đè bởi các lớp con của nó và thông báo sự kiện có thể xảy ra theo các thứ tự khác nhau và có thể trên các luồng khác nhau, đủ để phá vỡ bất kỳ "an toàn luồng" nào.
Họ không cung cấp một mô hình sự kiện đủ phong phú cho các ứng dụng. Ví dụ, họ chỉ ủng hộ quan niệm rằng có gì đó đã thay đổi, nhưng họ không truyền đạt bất kỳ thông tin nào về những gì đã thay đổi
Các vấn đề mở - Như đã đề cập, có rất nhiều vấn đề lớn được nêu ra (an toàn luồng, tuần tự hóa) và hầu hết chúng có các phức tạp để khắc phục và vẫn "không sửa" hoặc Không phát triển tích cực , và đó là lý do tại sao nó bị từ chối .
Tôi cũng khuyên bạn nên đọc câu trả lời này Tại sao mẫu quan sát viên không được dùng nữa? , @Jeff đã giải thích các lý do khác cho sự phản đối.
Bạn có thể sử dụng PropertyChangeEventvà PropertyChangeListenertừ java.beansgói.
PropertyChangeListenerthay thế Observer, nhưng tôi nên mở rộng / thực hiện những gì thay thế Observable?
PropertyChangeSupportbiến thể hiện, nhưng tôi đánh giá cao một xác nhận.
Tại sao Observer không được dùng trong Java 9?
Ans: Các Observablelớp và các Observergiao diện đã được tán trong Java 9 vì mô hình sự kiện được hỗ trợ bởi Observervà Observableđược khá hạn chế, trình tự thông báo cung cấp bởi Observablelà không xác định, và thay đổi trạng thái đang không ở trong một cho-một thư từ với thông báo.
Xem tài liệu Java https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html
Thay thế mô hình quan sát?
Có nhiều lựa chọn thay thế của mẫu thiết kế Observer và Reactive Streams là một trong số đó.
Luồng phản ứng hoặc API luồng :
Flowlà một lớp giới thiệu trong Java 9 và có 4 giao diện liên quan đến nhau: Processor, Publisher, Subscribervà Subscription.
Flow.Processor : Một thành phần hoạt động như cả Người đăng ký và Nhà xuất bản.
Flow.Publisher : Một nhà sản xuất các mặt hàng nhận được bởi Người đăng ký.
Flow.Subscriber : Một người nhận tin nhắn.
Flow.Subscription: Điều khiển tin nhắn liên kết a Flow.Publishervà Flow.Subscriber.
Xem tài liệu Java https://docs.oracle.com/javase/9/docs/api/java/util/concản/Flow.html
Xem xét rằng Observablelớp và Observergiao diện đã không được dùng nữa kể từ Java 9. Theo như bài viết Người quan sát và Quan sát của Java bị phản đối trong JDK 9
Mô hình sự kiện được Observer và Observable hỗ trợ khá hạn chế, thứ tự thông báo được phân phối bởi Observable là không xác định và các thay đổi trạng thái không tương ứng với một thông báo. Đối với một mô hình sự kiện phong phú hơn, hãy xem xét sử dụng
java.beansgói. Để nhắn tin đáng tin cậy và có trật tự giữa các luồng, hãy xem xét sử dụng một trong các cấu trúc dữ liệu đồng thời trongjava.util.concurrentgói. Để lập trình kiểu luồng phản ứng, hãy xem API Flow.