Làm cách nào để tránh các phụ thuộc vòng tròn khi bạn đang thiết kế hai lớp với mối quan hệ của nhà sản xuất/người tiêu dùng? Ở đây ListenerImpl cần một tham chiếu đến Broadcaster để đăng ký/unregister chính nó, và Broadcaster cần một tham chiếu trở lại để nghe để gửi tin nhắn. Ví dụ này là trong Java nhưng nó có thể áp dụng cho bất kỳ ngôn ngữ OO nào.Làm thế nào để tránh các phụ thuộc vòng tròn khi sử dụng các cuộc gọi lại?
public interface Listener {
void callBack(Object arg);
}
public class ListenerImpl implements Listener {
public ListenerImpl(Broadcaster b) { b.register(this); }
public void callBack(Object arg) { ... }
public void shutDown() { b.unregister(this); }
}
public class Broadcaster {
private final List listeners = new ArrayList();
public void register(Listener lis) { listeners.add(lis); }
public void unregister(Listener lis) {listeners.remove(lis); }
public void broadcast(Object arg) { for (Listener lis : listeners) { lis.callBack(arg); } }
}
Nhưng vẫn có một chu kỳ tài liệu tham khảo - đài truyền hình có một tham chiếu đối tượng ListenerImpl cụ thể mặc dù kiểu tham chiếu là kiểu giao diện Listener. Không một chu trình tham chiếu hàm ý một chu trình phụ thuộc? –
Không thực sự là một cách để loại bỏ chu trình tham chiếu. Đó là loại yêu cầu cho loại điều này. Chu kỳ tham chiếu không thực sự là vấn đề trong những ngày này, vì bất kỳ bộ thu gom rác tốt nào cũng đều xử lý chúng tốt. Đó là chu kỳ phụ thuộc mà bạn cần phải lo lắng. – Herms
@sk: để xác định 'chu kỳ', trước tiên bạn phải xác định 'phụ thuộc': không có chu kỳ biên dịch. Có _is_ một chu kỳ thời gian chạy nếu tất cả các tham chiếu là bằng nhau, và ai đó cần phải phá vỡ chu kỳ khi nó không còn cần thiết (loại bỏ người nghe) – xtofl