โดยทั่วไปใช่ควรใช้การอ้างอิงที่อ่อนแอ แต่ก่อนอื่นเราต้องมีความชัดเจนเกี่ยวกับสิ่งที่คุณหมายถึงโดย "ผู้ฟังเหตุการณ์"
เรียกกลับ
ในรูปแบบการเขียนโปรแกรมบางรูปแบบโดยเฉพาะอย่างยิ่งในบริบทของการดำเนินการแบบอะซิงโครนัสมันเป็นเรื่องปกติที่จะแสดงส่วนหนึ่งของการคำนวณในรูปแบบการโทรกลับที่ได้รับการดำเนินการในบางเหตุการณ์ ตัวอย่างเช่นPromise
[ 1 ] อาจมีthen
วิธีการที่ลงทะเบียนการติดต่อกลับเมื่อเสร็จสิ้นขั้นตอนก่อนหน้า:
promise =
Promise.new(async_task) # - kick off a task
.then(value => operation_on(value)) # - queue other operations
.then(value => other_operation(value)) # that get executed on completion
... # do other stuff in the meanwhile
# later:
result = promise.value # block for the result
ที่นี่การเรียกกลับที่ลงทะเบียนโดยthen
จะต้องมีการอ้างอิงที่รัดกุมเนื่องจากสัญญา (แหล่งที่มาของเหตุการณ์) เป็นวัตถุเดียวที่มีการอ้างอิงถึงการเรียกกลับ นี่ไม่ใช่ปัญหาเนื่องจากสัญญามีอายุการใช้งาน จำกัด และจะมีการรวบรวมขยะหลังจากโซ่สัญญาเสร็จสมบูรณ์
รูปแบบการสังเกตการณ์
ในรูปแบบของผู้สังเกตการณ์หัวเรื่องมีรายการของผู้สังเกตการณ์ที่ต้องพึ่งพา เมื่อผู้ทดสอบเข้าสู่บางสถานะผู้สังเกตการณ์จะได้รับแจ้งตามอินเตอร์เฟซบางอย่าง ผู้สังเกตการณ์สามารถเพิ่มและลบออกจากเรื่อง ผู้สังเกตการณ์เหล่านี้ไม่มีอยู่ในสุญญากาศความหมาย แต่กำลังรอเหตุการณ์เพื่อวัตถุประสงค์บางอย่าง
หากวัตถุประสงค์นี้ไม่มีอยู่อีกต่อไปผู้สังเกตการณ์ควรถูกลบออกจากเรื่อง แม้ในภาษาที่รวบรวมขยะการลบนี้อาจต้องดำเนินการด้วยตนเอง หากเราล้มเหลวในการลบผู้สังเกตการณ์มันจะยังคงมีชีวิตอยู่ผ่านการอ้างอิงจากเรื่องไปยังผู้สังเกตการณ์และด้วยวัตถุทั้งหมดที่ผู้สังเกตการณ์อ้างอิง สิ่งนี้จะสูญเสียความทรงจำและลดประสิทธิภาพลงเนื่องจากผู้สังเกตการณ์ (ตอนนี้ไร้ประโยชน์) จะยังคงได้รับแจ้ง
การอ้างอิงที่อ่อนแอแก้ไขการรั่วไหลของหน่วยความจำนี้เนื่องจากอนุญาตให้ผู้สังเกตรวบรวมขยะได้ เมื่อผู้ทดสอบไปแจ้งผู้สังเกตการณ์ทั้งหมดและพบว่าการอ้างอิงที่อ่อนแออย่างใดอย่างหนึ่งต่อผู้สังเกตการณ์นั้นว่างเปล่าการอ้างอิงนั้นสามารถลบออกได้อย่างปลอดภัย อีกทางหนึ่งการอ้างอิงที่อ่อนแออาจถูกนำไปใช้ในทางที่อนุญาตให้ผู้ทดลองลงทะเบียนการเรียกกลับแบบล้างข้อมูลที่จะลบผู้สังเกตการณ์เมื่อทำการรวบรวม
แต่โปรดทราบว่าการอ้างอิงที่อ่อนแอนั้นเป็นเพียงเครื่องมือช่วยในการจำกัดความเสียหายโดยการลืมเอาผู้สังเกตการณ์ออก ทางออกที่ถูกต้องคือทำให้แน่ใจว่าผู้สังเกตการณ์จะถูกลบออกเมื่อไม่ต้องการใช้อีกต่อไป ตัวเลือกรวมถึง:
ทำด้วยตนเอง แต่มีแนวโน้มที่จะเกิดข้อผิดพลาด
ใช้สิ่งที่คล้ายกับลองกับทรัพยากรใน Java หรือusing
ใน C #
การทำลายล้างที่กำหนดขึ้นเช่นผ่านทาง RAII สำนวน โปรดทราบว่าในภาษาที่มีการรวบรวมขยะที่กำหนดค่าได้สิ่งนี้อาจยังต้องมีการอ้างอิงที่ไม่ชัดเจนจากผู้ทดสอบไปยังผู้สังเกตการณ์เพื่อให้เกิดการทำลาย