"สวัสดีอีกครั้ง!"

"ตอนนี้ฉันจะบอกคุณเกี่ยวกับสิ่งที่ยอดเยี่ยมอีกอย่างหนึ่ง: WeakReference "

"ดูเหมือนเกือบจะเหมือนกับ SoftReference:"

ตัวอย่าง
// Create a Cat object
Cat cat = new Cat();

// Create a weak reference to a Cat object
WeakReference<Cat> catRef = new WeakReference<Cat>(cat);

// Now only the catRef weak reference points at the object
cat = null;

// Now the ordinary cat variable also references the object
cat = catRef.get();

// Clear the weak reference
catRef.clear();

"การอ้างอิงที่อ่อนแอมีคุณสมบัติพิเศษอีกอย่างหนึ่ง"

"ถ้าอ็อบเจกต์ไม่มีการอ้างอิงธรรมดาหรือการอ้างอิงแบบซอฟต์ แต่มีการอ้างอิงที่อ่อนแอเท่านั้น วัตถุนั้นจะมีชีวิต แต่มันจะถูกทำลายในการรวบรวมขยะครั้งต่อไป"

"พูดอีกครั้งได้ไหม? อะไรคือความแตกต่างระหว่างข้อมูลอ้างอิงเหล่านี้"

"วัตถุที่เก็บจากความตายโดยSoftReference เท่านั้นที่สามารถอยู่ รอดได้มากเท่าที่คุณต้องการและอาจถูกทำลายหากมีหน่วยความจำไม่เพียงพอ"

"วัตถุที่กันไว้ไม่ให้ตายโดยWeakReference เท่านั้น จะไม่รอดจากการรวบรวมขยะครั้งต่อไป แต่จนกว่าจะถึงตอนนั้น คุณสามารถรับวัตถุได้โดยการเรียกเมธอด get() บน WeakReference แล้วเรียกเมธอดหรือทำอย่างอื่นกับมัน "

"จะเกิดอะไรขึ้นถ้าวัตถุถูกอ้างอิงโดยทั้ง SoftReference และ WeakReference"

"ง่ายมาก ถ้าการอ้างอิงปกติอย่างน้อยหนึ่งรายการชี้ไปที่อ็อบเจกต์ สิ่งนั้นถือว่ามีชีวิต อย่างไรก็ตาม การอ้างอิงดังกล่าวเรียกว่า StrongReference"

"หากไม่มีการอ้างอิงทั่วไปที่ชี้ไปที่วัตถุ แต่ SoftReference ทำ ก็จะเข้าถึงได้อย่างนุ่มนวล"

"หากไม่มีการอ้างอิงปกติหรือ SoftReferences ที่ชี้ไปที่วัตถุ แต่ WeakReference ชี้ไป ก็จะเข้าถึงได้ไม่มากนัก"

"ลองคิดดูสิ SoftReference จะปกป้องออบเจกต์จากการถูกลบ และทำให้แน่ใจว่าออบเจ็กต์จะถูกลบก็ต่อเมื่อมีหน่วยความจำไม่เพียงพอเท่านั้น WeakReference จะเก็บอ็อบเจ็กต์ไว้จนกว่าจะมีการรวบรวมขยะครั้งต่อไป SoftReference มีความต้านทานต่อการลบมากกว่า"

“อ่า ฉันคิดว่าฉันเข้าใจแล้ว”

"เยี่ยมเลย ฉันจะบอกคุณเกี่ยวกับสิ่งที่น่าสนใจอีกอย่างหนึ่งเกี่ยวกับ WeakReferences นั่นคือ WeakHashMap"

"ฟังดูจริงจัง!"

"แล้วบางส่วน! WeakHashMap คือ HashMap ที่มีคีย์เป็นข้อมูลอ้างอิงที่อ่อนแอ (WeakReferences)"

"นั่นคือ คุณเพิ่มวัตถุลงใน HashMap ดังกล่าวและทำงานกับพวกมันได้ ทำธุรกิจได้ตามปกติ"

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

"แต่สมมติว่าไม่มีการอ้างอิงถึงวัตถุเหล่านี้อีกต่อไปในแอปพลิเคชันทั้งหมด สิ่งที่ป้องกันไม่ให้วัตถุเหล่านี้ตายคือ WeakReferences ไม่กี่รายการใน WeakHashMap หลังจากการรวบรวมขยะครั้งต่อไป วัตถุดังกล่าวจะหายไปจาก WeakHashMap ด้วยตัวเอง ราวกับว่าพวกมัน ไม่เคยอยู่ที่นั่น"

"ฉันไม่แน่ใจว่าฉันเข้าใจ"

"คุณเก็บคู่ของวัตถุใน WeakHashMap: คีย์และค่า แต่ WeakHashMap ไม่ได้อ้างอิงคีย์โดยตรง แต่อ้างอิงผ่าน WeakReferences ดังนั้นเมื่อวัตถุที่ใช้เป็นคีย์สามารถเข้าถึงได้น้อย วัตถุเหล่านั้นจะถูกทำลายในครั้งต่อไป การรวบรวมขยะ และด้วยเหตุนี้ ค่าต่างๆ จะถูกลบออกจาก WeakHashMap โดยอัตโนมัติด้วย"

"สะดวกมากที่จะใช้ WeakHashMap เพื่อจัดเก็บข้อมูลเพิ่มเติมเกี่ยวกับวัตถุบางอย่าง"

"อย่างแรกเลย การเข้าถึงข้อมูลนั้นง่ายมาก ถ้าคุณใช้วัตถุเป็นกุญแจสำคัญ"

"อย่างที่สอง ถ้าวัตถุถูกทำลาย มันจะหายไปจาก HashMap พร้อมกับข้อมูลที่เกี่ยวข้องทั้งหมด"

"ตัวอย่างเช่น:

ตัวอย่าง
// Create an object to store additional information about the user
WeakHashMap<User, StatisticInfo> userStatistics = new WeakHashMap<User, StatisticInfo>();

// Put information about the user into userStatistics
User user = session.getUser();
userStatistics.put(user, new StatisticInfo ());

// Get information about the user from userStatistics
User user = session.getUser();
StatisticInfo statistics = userStatistics.get(user);

// Remove any information about the user from userStatistics
User user = session.getUser();
userStatistics.remove(user);
  1. "ภายใน WeakHashMap คีย์จะถูกจัดเก็บเป็น WeakReferences"
  2. "ทันทีที่วัตถุผู้ใช้ถูกทำลายโดยตัวรวบรวมขยะ วิธีการลบ (ผู้ใช้) จะถูกเรียกโดยปริยายภายใน WeakHashMap และข้อมูลใดๆ ที่เกี่ยวข้องกับวัตถุผู้ใช้จะถูกลบออกจาก WeakHashMap โดยอัตโนมัติ"

"นี่ดูเหมือนเครื่องมือทรงพลัง ฉันจะใช้มันได้ที่ไหน"

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

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