"Hej igen!"

"Nu ska jag berätta om ytterligare en underbar sak: WeakReference ."

"Det ser nästan likadant ut som SoftReference:"

Exempel
// 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();

"En svag referens har en annan speciell egenskap."

"Om ett föremål inte har vanliga referenser eller mjuka referenser, utan bara svaga referenser, så är föremålet vid liv, men det kommer att förstöras vid nästa sophämtning."

"Kan du säga det igen? Vad är skillnaden mellan dessa referenser?"

"Ett föremål som endast hålls från döden av en SoftReference kan överleva hur många sophämtningar du vill och kommer förmodligen att förstöras om det inte finns tillräckligt med minne."

"Ett objekt som endast hålls från döden av en WeakReference kommer inte att överleva nästa sophämtning. Men tills det händer kan du få objektet genom att anropa metoden get() på WeakReference och sedan anropa dess metoder eller göra något annat med det ."

"Vad händer om objektet refereras av både en SoftReference och en WeakReference?"

"Det är enkelt. Om minst en vanlig referens pekar på ett objekt anses det vara levande. En sådan referens kallas förresten en StrongReference."

"Om inga vanliga referenser pekar på ett objekt, men en SoftReference gör det, är det lätt att nå."

"Om inga vanliga referenser eller SoftReferences pekar på ett objekt, men en WeakReference gör det, är det svagt nåbart."

"Tänk på det. En SoftReference skyddar objektet från att raderas och säkerställer att objektet tas bort endast om det inte finns tillräckligt med minne. En WeakReference håller objektet tills nästa sophämtning. En SoftReference ger större motstånd mot radering."

"Ah. Jag tror jag förstår."

"Bra, då ska jag berätta om en annan intressant sak som involverar WeakReferences - WeakHashMap."

"Låter allvarligt!"

"Och lite till! En ​​WeakHashMap är en HashMap vars nycklar är svaga referenser (WeakReferences)."

"Det vill säga att du lägger till objekt i en sådan HashMap och arbetar med dem. Business as usual."

"Så länge objekten som du lagrar i en WeakHashMap har vanliga (starka eller mjuka) referenser som nycklar, kommer dessa objekt att vara levande."

"Men anta att det inte finns fler referenser till dessa objekt i hela applikationen. Allt som hindrar dem från att dö är några WeakReferences inuti WeakHashMap. Efter nästa sophämtning kommer sådana objekt att försvinna från WeakHashMap. Av sig själva. Som om de var aldrig där."

"Jag är inte säker på att jag förstod."

"Du lagrar par av objekt i en WeakHashMap: en nyckel och ett värde. Men WeakHashMap refererar inte till nycklarna direkt, utan snarare genom WeakReferences. Därför, när objekten som används som nycklar blir svagt nåbara, förstörs de vid nästa sophämtning. Och som ett resultat tas deras värden också automatiskt bort från WeakHashMap."

"Det är väldigt bekvämt att använda en WeakHashMap för att lagra ytterligare information om vissa objekt."

"För det första är det väldigt enkelt att komma åt informationen om du använder själva objektet som nyckel."

"För det andra, om objektet förstörs, försvinner det från HashMap tillsammans med all tillhörande data."

"Till exempel:

Exempel
// 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. "Inuti en WeakHashMap lagras nycklar som WeakReferences."
  2. "Så snart användarobjektet förstörs av sopsamlaren, anropas remove(user)-metoden implicit inuti WeakHashMap och all information som är associerad med användarobjektet tas bort från WeakHashMap automatiskt."

"Det här ser ut som ett kraftfullt verktyg. Var kan jag använda det?"

"Det beror på omständigheterna. Låt oss säga att du har en tråd i programmet som spårar arbetet med vissa uppgifter, representerade av objekt, och skriver information om dem till en logg. Den här tråden kan lagra de övervakade objekten i en WeakHashMap. Så snart eftersom objekten inte behövs, tar sopsamlaren bort dem, och referenserna till dem tas också automatiskt bort från WeakHashMap."

"Låter intressant. Jag känner redan att jag ännu inte har skrivit några seriösa Java-program som drar fördel av så kraftfulla mekanismer. Men jag ska arbeta för det. Tack så mycket, Ellie, för en så intressant lektion."