Có một tình huống sẽ tốt hơn nếu sử dụng các tài liệu tham khảo yếu thay vì thành phần đơn giản?


10

Mặc dù tài liệu Java chỉ định, mà tài liệu tham khảo yếu là chủ yếu cho canonicalizing ánh xạ, bạn sẽ tìm thấy nhiều , nhiều , nhiều người trên internet nêu, rằng WeakHashMap là hoàn hảo để lưu trữ siêu dữ liệu đối tượng trong suốt cuộc đời của nó. Tuy nhiên, không ai bận tâm để làm một ví dụ dễ hiểu và phù hợp .

Sử dụng WeakHashMap để thêm đối tượng một số thuộc tính hoặc lưu trữ âm thanh siêu dữ liệu cho tôi, giống như một quyết định tùy ý dựa trên ý chí chỉ sử dụng thứ chết tiệt đó. Nói cách khác - một thiết kế xấu . Tôi hiểu rằng có những tình huống có thể không có sự kế thừa (các lớp, giao diện cuối cùng), nhưng về thành phần thì sao? Tôi không thể nghĩ ra một ví dụ trong đó sáng tác sẽ không phải là một lựa chọn. Và chắc chắn là một điều tốt hơn, bởi vì nó dựa trên một nguyên tắc được thiết lập tốt, thay vì một "sự giải quyết ngôn ngữ".

Vì vậy, có một tình huống, nơi sẽ tốt hơn để sử dụng các tài liệu tham khảo yếu thay vì thành phần đơn giản? Nếu không, tại sao mọi người trên internet dường như hiểu sai?


Lỗi logic: "... quyết định tùy ý dựa trên ý chí chỉ sử dụng thứ chết tiệt. Nói cách khác - một thiết kế tồi." Các kết thúc có thể không biện minh cho các phương tiện, nhưng các phương tiện không đủ để chống lại các kết thúc. Với các phương pháp tương tự, kết quả có thể giả thuyết là một thiết kế tốt. Mặc dù trong trường hợp này tôi sẽ không tranh luận. :)
cwharris

3
Tài liệu tham khảo yếu là một khái niệm trực giao cho thành phần và kế thừa.
Robert Harvey

Câu trả lời:


13

Giả sử tôi cần liên kết một số siêu dữ liệu với một số đối tượng dữ liệu. Đây là một kịch bản khá phổ biến. Tôi không kiểm soát các đối tượng dữ liệu và có rất nhiều đối tượng và API được đề cập (gọi lại, phương thức ảo, v.v.) cung cấp cho tôi các đối tượng dữ liệu đó, nhưng không có siêu dữ liệu của tôi. Vì vậy, tôi cần theo dõi một số trạng thái cho từng đối tượng dữ liệu đó, cụ thể là những trạng thái tôi đã thấy trước đây và có thể thấy lại. Tôi sẽ gọi siêu dữ liệu này là một trang sức, đó là một thuật ngữ đôi khi được sử dụng cho khái niệm đó.

Thành phần đơn giản cung cấp khả năng tra cứu dễ dàng từ đối tượng tô điểm (đối tượng có siêu dữ liệu) sang đối tượng khác (đối tượng có dữ liệu), với giả định rằng vì tôi điều khiển thiết kế đối tượng siêu dữ liệu, tôi có thể đặt tham chiếu trực tiếp vào đối tượng dữ liệu .

Tuy nhiên, trừ khi bạn kiểm soát thiết kế của đối tượng dữ liệu và có thể thay đổi nó, thành phần đơn giản không cung cấp tra cứu ngược (từ đối tượng dữ liệu sang một số siêu dữ liệu). Trong thực tế, trừ khi bạn có một bộ sưu tập các đối tượng siêu dữ liệu, bạn thậm chí không thể định vị được mục siêu dữ liệu liên quan được cung cấp một mục đối tượng (dữ liệu).

Ngoài vấn đề tra cứu theo hướng đi từ đối tượng để tìm siêu dữ liệu đáng ngưỡng mộ của nó, còn có vấn đề về tuổi thọ siêu dữ liệu.

Siêu dữ liệu tích lũy và không bao giờ được phát hành ngay cả khi đối tượng dữ liệu không còn được sử dụng là rò rỉ bộ nhớ.

Một hashmap tham chiếu yếu giải quyết cả hai vấn đề. Nó cho phép định vị siêu dữ liệu được cung cấp dữ liệu và cho phép siêu dữ liệu được giải phóng tại một thời điểm sau khi dữ liệu được giải phóng.

Lưu ý thêm rằng một hashmap tham chiếu yếu cho phép không chỉ các giá trị (siêu dữ liệu) được thu hồi (gc'ed), mà cả các khóa (dữ liệu) được thu hồi (gc'ed), vì nếu các khóa được giữ cũng sẽ là một rò rỉ bộ nhớ, và hơn nữa, các giá trị không bao giờ có thể được phát hành.


Tại sao không sử dụng các đối tượng dữ liệu với bảng siêu dữ liệu được hỗ trợ bởi hashmap yếu được tính là thành phần?
Jack

2
@Jack, Thành phần, đặc biệt là "thành phần đơn giản" trong suy nghĩ của tôi ít nhất, là các đối tượng đề cập đến các đối tượng khác, nhưng trực tiếp là như vậy. Mối quan hệ "có-một" của bố cục được thể hiện bằng cách sử dụng một tham chiếu đơn giản, hoặc đôi khi là một bộ sưu tập. Ở đây hashmap là một phương thức gián tiếp. Bạn không thể đạt đến trang điểm nếu bạn không có hashmap. Trong khi đó trong thành phần bạn có thể làm điều hướng này. Vì vậy, tôi thích gọi siêu dữ liệu này là một trang sức hơn là thành phần, nhưng chúng chắc chắn có liên quan. FWIW, trang sức không (IMHO) sáng tác với dữ liệu, không phải là cách khác.
Erik Eidt

@Jack, re: FWIW cuối cùng của tôi, tôi chỉ nhận ra rằng khi sử dụng hàm băm yếu, thông thường bạn sẽ không đưa tham chiếu từ đối tượng trang trí siêu dữ liệu sang đối tượng khác vì giữ bộ nhớ (hoặc nếu bạn muốn có hướng, nó sẽ phải là một tài liệu tham khảo yếu). Vì vậy, thông thường, máy khách hashmap yếu hoạt động với hai nhược điểm được ghép nối hiệu quả với nhau nhưng về mặt kỹ thuật không phải là thành phần đối tượng với nhau.
Erik Eidt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.