มีสถานการณ์ที่จะดีกว่าถ้าใช้การอ้างอิงที่อ่อนแอแทนการเรียบง่าย


10

แม้ว่าเอกสาร Javaระบุว่าลำดับที่อ่อนแอเป็นหลักสำหรับกำลังยอมรับแมปคุณจะพบจำนวนมาก , หลาย , หลายคนบนอินเทอร์เน็ตระบุว่า WeakHashMap ที่สมบูรณ์แบบสำหรับการจัดเก็บข้อมูลเมตาของวัตถุในช่วงชีวิตของมัน แต่ไม่มีใครรบกวนจิตใจที่จะทำให้เข้าใจและเหมาะสมตัวอย่างเช่น

การใช้ WeakHashMap เพื่อเพิ่มคุณสมบัติบางอย่างของวัตถุหรือเก็บข้อมูลเมตาให้กับฉันเช่นการตัดสินใจตามอำเภอใจตามความตั้งใจที่จะใช้สิ่งแช่ง ในคำอื่น ๆ - เป็นการออกแบบที่ไม่ดี ฉันเข้าใจว่ามีสถานการณ์ที่การสืบทอดอาจไม่พร้อมใช้งาน (คลาสสุดท้ายอินเทอร์เฟซ) แต่สิ่งที่เกี่ยวกับการแต่ง ฉันไม่สามารถนึกถึงตัวอย่างหนึ่งที่องค์ประกอบจะไม่มีตัวเลือก และแน่นอนว่าเป็นสิ่งที่ดีกว่าเพราะมันขึ้นอยู่กับหลักการที่ดีขึ้นแทนที่จะเป็น "การเล่นโวหารของภาษา"

ดังนั้นมีสถานการณ์ที่จะดีกว่าที่จะใช้การอ้างอิงที่อ่อนแอแทนการเรียบง่าย? ถ้าไม่ทำไมทุกคนบนอินเทอร์เน็ตดูเหมือนผิดพลาด?


ข้อผิดพลาดเชิงตรรกะ: "... การตัดสินใจตามอำเภอใจขึ้นอยู่กับความตั้งใจที่จะใช้สิ่งแช่งในคำอื่น ๆ - การออกแบบที่ไม่ดี" ปลายอาจไม่ปรับวิธีการ แต่หมายถึงไม่เพียงพอที่จะโต้กลับปลาย ด้วยวิธีการเดียวกันผลที่ได้อาจเป็นไปได้ว่าการออกแบบดี แม้ว่าในกรณีนี้ฉันจะไม่เถียงมัน :)
cwharris

3
การอ้างอิงที่อ่อนแอเป็นแนวคิดมุมฉากในการจัดองค์ประกอบและการสืบทอด
Robert Harvey

คำตอบ:


13

สมมติว่าฉันต้องการเชื่อมโยงข้อมูลเมตากับวัตถุข้อมูลบางอย่าง นี่เป็นสถานการณ์ทั่วไปที่ค่อนข้างสวย ฉันไม่ได้ควบคุมวัตถุข้อมูลและมีจำนวนมากและ API ที่เป็นปัญหา (การเรียกกลับวิธีการเสมือน ฯลฯ ) เสนอวัตถุข้อมูลเหล่านั้นให้ฉัน แต่ไม่มีเมตาดาต้าของฉัน ดังนั้นฉันจำเป็นต้องติดตามสถานะบางอย่างสำหรับแต่ละวัตถุข้อมูลเหล่านั้นคือสิ่งที่ฉันเคยเห็นมาก่อนและอาจเห็นอีกครั้ง ฉันจะเรียกเมทาดาทานี้ว่าเป็นการตกแต่งซึ่งเป็นคำที่บางครั้งใช้สำหรับแนวคิดนั้น

การจัดองค์ประกอบอย่างง่ายช่วยให้ค้นหาได้ง่ายจากวัตถุ adorning (อันที่มีข้อมูลเมตา) ไปยังวัตถุอื่น (อันที่มีข้อมูล) ด้วยข้อสันนิษฐานว่าเนื่องจากฉันควบคุมการออกแบบวัตถุเมทาดาทาฉันสามารถใส่การอ้างอิงนั้นโดยตรงกับวัตถุข้อมูลได้ .

อย่างไรก็ตามถ้าคุณไม่สามารถควบคุมการออกแบบของวัตถุข้อมูลและสามารถเปลี่ยนแปลงได้องค์ประกอบที่เรียบง่ายไม่ได้ให้การค้นหาแบบย้อนกลับ (จากวัตถุข้อมูลไปยังข้อมูลเมตาบางส่วน) ในความเป็นจริงถ้าคุณไม่มีการรวบรวมวัตถุเมทาดาทาคุณจะไม่สามารถค้นหารายการเมทาดาทาที่เกี่ยวข้องที่กำหนดรายการวัตถุ (ข้อมูล) ได้

นอกจากปัญหาการค้นหาในทิศทางที่ไปจากวัตถุเพื่อค้นหาเมทาดาทา adorning ของมันยังมีปัญหาของอายุการใช้งานเมทาดาทา

ข้อมูลเมตาที่สะสมและไม่เคยถูกนำออกใช้แม้ว่าวัตถุข้อมูลจะไม่ถูกใช้อีกต่อไปคือหน่วยความจำรั่ว

hashmap การอ้างอิงที่ต่ำจะช่วยแก้ปัญหาทั้งสองได้ จะช่วยให้การค้นหาข้อมูลเมตาที่ได้รับข้อมูลและช่วยให้เมตาดาต้าที่จะเป็นอิสระในบางครั้งหลังจากที่ข้อมูลจะถูกปล่อย

โปรดทราบเพิ่มเติมว่า hashmap อ้างอิงที่อ่อนแอนั้นไม่เพียง แต่ช่วยให้สามารถเรียกคืนค่า (ข้อมูลเมตา) (gc'ed) เท่านั้น แต่ยังสามารถใช้คีย์ (ข้อมูล) เพื่อเรียกคืน (gc'ed) ได้อีกด้วยเนื่องจากหากมีการเก็บรักษาคีย์ที่จะเป็น หน่วยความจำรั่วและยิ่งกว่านั้นค่าจะไม่ถูกปล่อยออกมาอย่างใดอย่างหนึ่ง


เหตุใดจึงไม่ใช้วัตถุข้อมูลที่มีตารางข้อมูลเมตาที่แอ่นแฮชแมปอ่อนเป็นองค์ประกอบ
แจ็ค

2
@ แจ็คองค์ประกอบโดยเฉพาะอย่างยิ่ง "องค์ประกอบเรียบง่าย" ในใจของฉันอย่างน้อยก็คือวัตถุที่อ้างถึงวัตถุอื่น ๆ แต่โดยตรงดังนั้น ความสัมพันธ์ขององค์ประกอบ "has-a" ถูกแสดงโดยใช้การอ้างอิงอย่างง่าย ๆ หรือบางครั้งก็เป็นคอลเล็กชัน ที่นี่ hashmap เป็นวิธีการทางอ้อม คุณไม่สามารถเข้าถึงเครื่องประดับได้หากคุณไม่มี hashmap คุณสามารถทำการนำทางนี้ได้โดยใช้องค์ประกอบ ดังนั้นฉันชอบเรียกเมทาดาทานี้ว่าเป็นเครื่องประดับมากกว่าการแต่งเพลง แต่พวกเขาเกี่ยวข้องกันอย่างแน่นอน FWIW การตกแต่งทำ (IMHO) ประกอบกับข้อมูลไม่ใช่วิธีอื่น ๆ
Erik Eidt

@ แจ็คอีกครั้ง: FWIW ล่าสุดของฉันฉันเพิ่งรู้ว่าเมื่อใช้ hashmap ที่อ่อนแอคุณจะไม่ใส่ข้อมูลอ้างอิงจากวัตถุ adorning adorning ไปยังอีกเพราะหน่วยความจำ (หรือถ้าคุณต้องการที่มีใน ทิศทางมันจะต้องมีการอ้างอิงที่อ่อนแอ) ดังนั้นโดยทั่วไปแล้วไคลเอ็นต์แฮชแมพที่อ่อนแอจะทำงานร่วมกับสองสิ่งที่จับคู่กันได้อย่างมีประสิทธิภาพ แต่ไม่ได้มีเทคนิคในการจัดองค์ประกอบวัตถุซึ่งกันและกัน
Erik Eidt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.