"Hej igen!"

"Nu vil jeg fortælle dig om endnu en vidunderlig ting: WeakReference ."

"Det ser næsten det samme ud 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 svag reference har en anden speciel funktion."

"Hvis en genstand ikke har almindelige referencer eller bløde referencer, men kun svage referencer, så er objektet i live, men det vil blive ødelagt ved næste affaldsindsamling."

"Kan du sige det igen? Hvad er forskellen mellem disse referencer?"

"En genstand, der kun holdes fra døden af ​​en SoftReference , kan overleve så mange affaldssamlinger , som du vil, og vil sandsynligvis blive ødelagt, hvis der ikke er tilstrækkelig hukommelse."

"Et objekt, der kun holdes fra døden af ​​en WeakReference , vil ikke overleve den næste affaldsopsamling. Men indtil det sker, kan du hente objektet ved at kalde get()-metoden på WeakReference og derefter kalde dets metoder eller gøre noget andet med det ."

"Hvad hvis objektet refereres af både en SoftReference og en WeakReference?"

"Det er enkelt. Hvis mindst én almindelig reference peger på et objekt, anses det for at være levende. En sådan reference kaldes i øvrigt en StrongReference."

"Hvis ingen regelmæssige referencer peger på et objekt, men en SoftReference gør det, så er det let tilgængeligt."

"Hvis ingen almindelige referencer eller SoftReferences peger på et objekt, men en WeakReference gør det, så er det svagt tilgængeligt."

"Tænk over det. En SoftReference beskytter objektet mod at blive slettet og sikrer, at objektet kun slettes, hvis der ikke er tilstrækkelig hukommelse. En WeakReference holder objektet indtil næste skraldopsamling. En SoftReference giver større modstand mod sletning."

"Ah. Jeg tror, ​​jeg forstår."

"Godt, så vil jeg fortælle dig om en anden interessant ting, der involverer WeakReferences - WeakHashMap."

"Lyder alvorligt!"

"Og så nogle! Et WeakHashMap er et HashMap, hvis nøgler er svage referencer (WeakReferences)."

"Det vil sige, at du tilføjer objekter til sådan et HashMap og arbejder med dem. Business as usual."

"Så længe de objekter, du gemmer i et WeakHashMap, har regelmæssige (stærke eller bløde) referencer som nøgler, vil disse objekter være i live."

"Men antag, at der ikke er flere referencer til disse objekter i hele applikationen. Det eneste, der forhindrer dem i at dø, er et par WeakReferences inde i WeakHashMap. Efter den næste skraldesamling vil sådanne objekter forsvinde fra WeakHashMap. Af sig selv. Som om de var der aldrig."

"Jeg er ikke sikker på, jeg forstod."

"Du gemmer par af objekter i et WeakHashMap: en nøgle og en værdi. Men WeakHashMap refererer ikke til nøglerne direkte, men snarere gennem WeakReferences. Derfor, når de objekter, der bruges som nøgler bliver svagt tilgængelige, bliver de ødelagt ved næste skraldindsamling. Og som et resultat bliver deres værdier også automatisk fjernet fra WeakHashMap."

"Det er meget praktisk at bruge et WeakHashMap til at gemme yderligere information om bestemte objekter."

"For det første er det meget nemt at få adgang til informationen, hvis du bruger selve objektet som nøglen."

"For det andet, hvis objektet bliver ødelagt, forsvinder det fra HashMap sammen med alle de tilknyttede 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. "Inde i et WeakHashMap gemmes nøgler som WeakReferences."
  2. "Så snart brugerobjektet er ødelagt af skraldeopsamleren, kaldes fjern(bruger)-metoden implicit inde i WeakHashMap, og enhver information forbundet med brugerobjektet fjernes automatisk fra WeakHashMap."

"Dette ligner et kraftfuldt værktøj. Hvor kan jeg bruge det?"

"Det afhænger af omstændighederne. Lad os sige, at du har en tråd i programmet, der sporer arbejdet med nogle opgaver, repræsenteret af objekter, og skriver information om dem til en log. Denne tråd kunne gemme de overvågede objekter i et WeakHashMap. Så snart da objekterne ikke er nødvendige, sletter skraldemanden dem, og referencerne til dem fjernes også automatisk fra WeakHashMap."

"Lyder interessant. Jeg føler allerede, at jeg endnu ikke har skrevet nogen seriøse Java-programmer, der udnytter så kraftfulde mekanismer. Men jeg vil arbejde hen imod det. Mange tak, Ellie, for sådan en interessant lektion."