2010-03-04 22 views
28

Đã trò chuyện với một đồng nghiệp về thiết kế thư viện Javas. Tôi đã đề cập đến tôi luôn luôn tìm thấy nó buồn cười rằng các lớp AWT/Swing được gọi là về cơ bản cung cấp một giao diện quan sát trên một widget UI đã được gọi là "người nghe".java.util.Observable có được sử dụng ở mọi nơi không?

Whereupon ông floored tôi bằng cách chỉ ra rằng sẽ có một cuộc xung đột tên với java.util.Observerjava.util.Observable, đã được khoảng từ JDK 1.0. Tôi chưa bao giờ nghe nói về họ trước đây.

Không có tập quán nào được liệt kê trong JavaDocs và google/googlecode không đưa ra nhiều, vậy có ai biết nếu chúng được sử dụng ở đâu đó trong JDK không? Họ dường như không nhận được bất kỳ tình yêu chung chung nào, vì vậy có lẽ họ không "phổ biến". Có ai thấy chúng hữu ích không?

+0

Bạn cũng có thể xem xét báo cáo tại đây: http://stackoverflow.com/questions/1697215/what-is- của bạn-yêu thích-java-api-annoyance – ewernli

+0

Cảm ơn, nhưng nó không phải là khó chịu. Chỉ một chút buồn. – MHarris

+1

Tôi thấy chúng hữu ích vào năm 1996, trước khi JavaBeans và AWT 2.0 hỗ trợ thay đổi lắng nghe một tính năng phổ biến hơn của ngôn ngữ. Hãy coi chúng như là nguyên mẫu cho tất cả các giao diện người nghe sự kiện mà bạn thấy trong suốt JDK ngày nay. Họ chỉ quan tâm đến lịch sử. –

Trả lời

12

ObserverObservable vẫn được sử dụng trong rất nhiều mã hướng dẫn Eclipse để phát hiện khi nội dung trong hộp nhập thay đổi, vì vậy bản thân thuật sĩ có thể được cập nhật. Tôi đã phải làm việc với một số công cụ này, thay đổi nó cho nhu cầu riêng của chúng tôi .. :)

18

Chúng không được sử dụng vì thiết kế của chúng không hoàn thiện: chúng không phải là type safe. Bạn có thể đính kèm bất kỳ đối tượng nào triển khai Observer vào bất kỳ Observable nào, có thể dẫn đến các lỗi nhỏ.

Gói chúng bên trong một giao diện an toàn kiểu là về cùng một lượng công việc như triển khai mẫu từ đầu, vì vậy tôi đoán phần sau được ưu tiên trong hầu hết các trường hợp. Đây là một trong những điều thiếu sót trong Java 1.0 do các lựa chọn thiết kế tối ưu được thực hiện dưới áp lực thời gian (những người khác bao gồm API thu thập Java 1.0 và java.util.Date), nhưng do bản chất của các API công cộng có thể không bao giờ bị xóa nữa (chỉ bị phản đối).

+1

@ Péter Török: Bạn chỉ có thể đính kèm một đối tượng thực hiện giao diện * Observer * thành * Observable *, điều này hoàn toàn bình thường. Tôi hy vọng rằng bằng cách gói chúng bên trong một giao diện an toàn kiểu bạn không nghĩ đến việc sử dụng Generics, bởi vì nó không hoạt động cho người quan sát/quan sát được do loại xóa (tốt, nó hoạt động, nhưng chỉ cho trường hợp đơn giản, Các công trình có thể quan sát được). Nhưng được cấp, thật dễ dàng để thực hiện từ đầu bằng cách sử dụng COWAL mà không có nhiều điểm trong việc sử dụng những phần còn lại 1.0 cũ này. – SyntaxT3rr0r

+0

@WizardOfThêm tôi biết điều này. Tôi đã chỉnh sửa mã, hy vọng nó rõ ràng hơn bây giờ. –

+1

@WizardOfOdds: Việc sử dụng các generics cho một người quan sát/quan sát viên là người quan sát thường phải có quyền truy cập vào các quan sát được để đúc với loại liên quan của nó trong bối cảnh này. Do việc triển khai thực hiện mẫu JDK không cung cấp Generics, nó làm tăng các vấn đề ClassCast một cách dễ dàng. –

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