2011-12-29 37 views

Trả lời

4

Để thêm trường động vào đối tượng.

Một số ngôn ngữ hỗ trợ trực tiếp trường động: bất kỳ ai cũng có thể thêm bất kỳ trường nào vào đối tượng bất kỳ lúc nào.

Điều này rất tiện lợi khi bạn muốn liên kết một số thông tin với đối tượng, không thể chấp nhận được bởi nhà thiết kế đối tượng.

Java không có trường động thực sự. Chúng tôi có thể mô phỏng nó bằng cách sử dụng một bản đồ nhận dạng để liên kết một đối tượng với một số thông tin của một số loại.

WeakHashMap tốt hơn cho mục đích; nó cũng là một bản đồ nhận dạng, và nó không thêm tham chiếu mạnh bổ sung vào đối tượng. Vì vậy, nó gần gũi hơn với khái niệm trường động.

Đồng thời là vấn đề còn lại. Nếu hai luồng truy cập cùng một trường động của hai đối tượng khác nhau, không nên có sự phụ thuộc giữa hai luồng. Chúng tôi có thể giải quyết nó bằng một số loại băm mềm yếu đồng thời. Tuy nhiên hiệu suất không phải là lý tưởng so với truy cập trường bình thường.

Suy nghĩ về java.lang.ThreadLocal, thêm trường động vào chủ đề; và java.lang.ClassValue, thêm trường động vào lớp. Chúng không thực sự cần thiết - chúng ta có thể đạt được điều tương tự với bản đồ yếu đồng thời. Chúng tồn tại vì lý do hiệu suất. JDK có thể "hack" vào Thread/Class để thêm hỗ trợ để đạt được tra cứu nhanh hơn.

+1

Abover nó nói rằng 'WeakHashMap' "cũng là một bản đồ nhận dạng" .Đây không phải là trường hợp - trong thực tế, trong lỗi [4500542] (http://bugs.sun.com/view_bug.do?bug_id=4500542) trong DB lỗi Java họ thừa nhận rằng nó có lẽ nên có được một nhưng isn ' t. Đối với một hashmap bản sắc yếu xem javadoc cho lớp MapMaper ổi (bit về 'MapMaker mới(). WeakKeys(). MakeMap()'). –

8

Có một cái nhìn tại Java Docs :-)

Một sử dụng điển hình của lớp này được topo bảo quản đối tượng đồ thị biến đổi, chẳng hạn như tuần tự hoặc sâu sao chép. Để thực hiện chuyển đổi như vậy, một chương trình phải duy trì "bảng nút" mà theo dõi tất cả các tham chiếu đối tượng đã được xử lý . Bảng nút phải không cân bằng các đối tượng riêng biệt ngay cả khi chúng xảy ra bằng nhau. Một cách sử dụng điển hình của lớp này là để duy trì các đối tượng proxy. Ví dụ, một cơ sở gỡ lỗi có thể muốn để duy trì một đối tượng proxy cho từng đối tượng trong chương trình đang được gỡ lỗi.

Trên một mặt lưu ý: nó có sẵn kể từ phiên bản 1.4, không Java 5 hoặc 6 ...

2

Khi serializing đối tượng có thể thay đổi mà bạn muốn theo dõi các đối tượng mà bạn có serialized và id tham khảo của họ. Bạn không thể sử dụng bình đẳng như bạn không thể tin tưởng các đối tượng có thể thay đổi để sử dụng kiểm tra nhận dạng cho bằng và không thay đổi. ví dụ. Ngày tháng có thể thay đổi và bằng nội dung so sánh.

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