"Hallo igjen!"

"Nå skal jeg fortelle deg om en fantastisk ting til: WeakReference ."

"Det ser nesten likt ut som SoftReference:"

Eksempel
// 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 svak referanse har en annen spesiell funksjon."

"Hvis et objekt ikke har vanlige referanser eller myke referanser, men bare svake referanser, så er objektet i live, men det vil bli ødelagt ved neste søppelhenting."

"Kan du si det igjen? Hva er forskjellen mellom disse referansene?"

"En gjenstand som kun holdes fra døden av en SoftReference kan overleve så mange søppelsamlinger du vil og vil sannsynligvis bli ødelagt hvis det ikke er nok minne."

"Et objekt holdt fra døden bare av en WeakReference vil ikke overleve neste søppelsamling. Men inntil det skjer, kan du hente objektet ved å kalle get()-metoden på WeakReference og deretter kalle metodene eller gjøre noe annet med det ."

"Hva om objektet er referert av både en SoftReference og en WeakReference?"

"Det er enkelt. Hvis minst én vanlig referanse peker på et objekt, anses det som levende. En slik referanse kalles forresten en StrongReference."

"Hvis ingen vanlige referanser peker til et objekt, men en SoftReference gjør det, er det lett tilgjengelig."

"Hvis ingen vanlige referanser eller SoftReferences peker til et objekt, men en WeakReference gjør det, er det svakt tilgjengelig."

"Tenk på det. En SoftReference beskytter objektet fra å bli slettet og sikrer at objektet vil bli slettet bare hvis det ikke er nok minne. En WeakReference holder objektet til neste søppelsamling. En SoftReference gir større motstand mot sletting."

"Ah. Jeg tror jeg forstår."

"Flott, da skal jeg fortelle deg om en annen interessant ting som involverer WeakReferences - WeakHashMap."

"Høres alvorlig ut!"

"Og litt til! Et WeakHashMap er et HashMap hvis nøkler er svake referanser (WeakReferences)."

"Det vil si at du legger til objekter i et slikt HashMap og jobber med dem. Business as usual."

"Så lenge objektene du lagrer i et WeakHashMap har vanlige (sterke eller myke) referanser som nøkler, vil disse objektene være i live."

"Men anta at det ikke er flere referanser til disse objektene i hele applikasjonen. Alt som hindrer dem fra å dø er noen få WeakReferences inne i WeakHashMap. Etter neste søppelsamling vil slike objekter forsvinne fra WeakHashMap. Av seg selv. Som om de var aldri der."

"Jeg er ikke sikker på at jeg forsto."

"Du lagrer par av objekter i et WeakHashMap: en nøkkel og en verdi. Men WeakHashMap refererer ikke nøklene direkte, men snarere gjennom WeakReferences. Derfor, når objektene som brukes som nøkler blir svakt tilgjengelige, blir de ødelagt ved neste søppelinnsamling. Og som et resultat blir verdiene deres også automatisk fjernet fra WeakHashMap."

"Det er veldig praktisk å bruke et WeakHashMap til å lagre tilleggsinformasjon om visse objekter."

"For det første er det veldig enkelt å få tilgang til informasjonen hvis du bruker selve objektet som nøkkel."

"For det andre, hvis objektet blir ødelagt, forsvinner det fra HashMap sammen med alle tilhørende data."

"For eksempel:

Eksempel
// 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. "I et WeakHashMap lagres nøkler som WeakReferences."
  2. "Så snart brukerobjektet er ødelagt av søppelsamleren, kalles fjern(bruker)-metoden implisitt inne i WeakHashMap og all informasjon knyttet til brukerobjektet fjernes automatisk fra WeakHashMap."

"Dette ser ut som et kraftig verktøy. Hvor kan jeg bruke det?"

"Det avhenger av omstendighetene. La oss si at du har en tråd i programmet som sporer arbeidet til noen oppgaver, representert av objekter, og skriver informasjon om dem til en logg. Denne tråden kan lagre de overvåkede objektene i et WeakHashMap. Så snart Siden objektene ikke er nødvendige, sletter søppelsamleren dem, og referansene til dem blir også automatisk fjernet fra WeakHashMap."

"Høres interessant ut. Jeg føler allerede at jeg ennå ikke har skrevet noen seriøse Java-programmer som utnytter slike kraftige mekanismer. Men jeg skal jobbe mot det. Tusen takk, Ellie, for en så interessant leksjon."