2013-02-27 32 views
21

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?

+1

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ể. –

Trả lời

22

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.

0

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.

1

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.

0
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

Các vấn đề liên quan