Gần đây tôi đã đọc về lớp học Observable của Java. Những gì tôi không hiểu là: trước khi thông báo cho các quan sát viên (notifyObservers()) tôi phải gọi setChanged(). Có một phương thức boolean bên trong notificationObservers yêu cầu chúng ta gọi setChanged. Mục đích của giá trị boolean là gì và tại sao tôi phải gọi setChanged()?Tại sao tôi cần gọi setChanged trước khi tôi thông báo cho các nhà quan sát?
Trả lời
Trong điều trị lâu dài, bạn có thể gọi nhiều lần setChanged() nhưng cuối cùng, chỉ một lần notifyObservers(). Nếu, trước khi kết thúc, vì lý do nội bộ bạn quyết định quay trở lại, bạn có thể chọn gọi số clearChanged(). Trong trường hợp sau, notifyObservers() không có hiệu lực.
setchanged() được sử dụng làm dấu hiệu hoặc cờ để thay đổi trạng thái. nếu nó đúng là notifyObservers() có thể chạy và cập nhật tất cả các quan sát viên. nếu nó sai thì notifyObservers() được gọi mà không gọi hàm setchanged() và các quan sát viên sẽ không được thông báo.
lý do có thể có thể được setChanged() có công cụ sửa đổi được bảo vệ. Trong khi đó, notifyObservers() có thể được gọi bất cứ nơi nào, thậm chí bởi một người quan sát. Kể từ đó, quan sát và quan sát viên có thể tương tác với nhau với cơ chế này.
public void notifyObservers(Object arg) {
/*
* a temporary array buffer, used as a snapshot of the state of
* current Observers.
*/
Observer[] arrLocal;
synchronized (this) {
/* We don't want the Observer doing callbacks into
* arbitrary Observables while holding its own Monitor.
* The code where we extract each Observable from
* the ArrayList and store the state of the Observer
* needs synchronization, but notifying observers
* does not (should not). The worst result of any
* potential race-condition here is that:
*
* 1) a newly-added Observer will miss a
* notification in progress
* 2) a recently unregistered Observer will be
* wrongly notified when it doesn't care
*/
if (!hasChanged())
return;
arrLocal = observers.toArray(new Observer[observers.size()]);
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
arrLocal[i].update(this, arg);
}
Các bình luận là lý do
- 1. Tôi nên xóa người quan sát thông báo ở đâu?
- 2. Thứ tự thông báo NSNotification của thông báo quan sát
- 3. Tôi có cần gọi MessageDigest.reset() trước khi sử dụng không?
- 4. Nếu thêm người quan sát cho một thông báo trong AppDelegate, tôi có cần phải xóa nó đi không?
- 5. Các nhà quan sát đường ray - Khi nào và khi nào không sử dụng các nhà quan sát trong Rails
- 6. Tại sao tôi không nên gọi setVisible (true) trước khi thêm các thành phần?
- 7. Tại sao tôi cần truyền tự id?
- 8. Tại sao và khi nào tôi cần Azure?
- 9. Tại sao tôi cần dấu hoa thị trước một mảng?
- 10. Tại sao tôi cần phải gọi dispose trên ASP.NET Controls?
- 11. Tại sao Grails không thông báo cho tôi về lỗi khi lưu đối tượng miền?
- 12. Tại sao tôi nhận được thông báo lỗi WCF này?
- 13. Quan sát/Quan sát Android
- 14. MapView, MKAnnotation & Key-Value-Quan sát - Thông báo lỗi
- 15. Tại sao tôi cần hai lớp indirection cho macro?
- 16. Tại sao tôi cần phải bản địa hóa $ @ trước khi sử dụng eval?
- 17. Tại sao tôi cần phải redeclare các thành phần VHDL trước khi instantiating chúng trong kiến trúc khác?
- 18. Trong Haskell, tại sao tôi cần phải đặt một $ trước khối của tôi?
- 19. Tại sao tôi cần xóa hồ bơi kết nối mỗi khi tôi triển khai lại?
- 20. Tại sao chúng ta cần các nhà thầu tĩnh?
- 21. Tại sao mẫu người quan sát bị phản đối?
- 22. Tại sao has_many của tôi thông qua hồ sơ liên quan (đôi khi) chỉ đọc?
- 23. Tại sao tôi không phải thêm 'python' trước khi gọi tập lệnh Python?
- 24. Tại sao tôi cần sử dụng ngắt?
- 25. Tại sao tôi cần Giao diện?
- 26. Tại sao tôi cần tệp * .obj khi liên kết tĩnh?
- 27. Khi ContentResolver.notifyChange() được gọi cho một URI đã cho, các ContentObservers có quan sát các URI con của URI này được thông báo không?
- 28. Sự khác biệt lớn giữa các nhà quan sát và các cuộc gọi lại là gì?
- 29. KVO: Tôi có thể xóa tất cả các nhà quan sát khỏi đối tượng cụ thể không
- 30. Tại sao/khi nào tôi cần mục tiêu 'sạch'?
Nó đáng chú ý là tính năng này không thường xuyên xuất hiện trong lồng vào cốt khác của mô hình này, cho JavaBeans dụ sự kiện/thính giả. 'Observer' /' Observable' là một cặp lớp/giao diện khủng khiếp. Điểm của các mẫu là lặp lại, thay vì đề cập đến các lớp cụ thể. –