Sobes.tech
Middle

Ce tipuri de referințe există în Java și care sunt caracteristicile lor?

sobes.tech AI

Răspuns de la AI

În Java, există trei tipuri principale de referințe (variabile de referință), care diferă în comportamentul colectorului de gunoi:

  • Referință Puternică (Strong Reference)
  • Referință Moale (Soft Reference)
  • Referință Slabă (Weak Reference)
  • Referință Fantomă (Phantom Reference)

Referință Puternică (Strong Reference)

Acesta este cel mai comun tip de referință. Un obiect indicat de o referință puternică nu va fi colectat de colectorul de gunoi atâta timp cât există cel puțin o referință puternică către el.

// Crearea unui obiect și a unei referințe puternice către el
Object myObject = new Object(); 

Referință Moale (Soft Reference)

O referință moale indică un obiect care poate fi colectat de colectorul de gunoi dacă JVM are nevoie de memorie. Obiectele indicate doar prin referințe moale nu vor fi garantat colectate până când JVM-ul are nevoie urgentă de eliberare a memoriei. Folosit frecvent pentru cache-uri.

import java.lang.ref.SoftReference;

// Crearea unui obiect
Object data = new Object(); 
// Crearea unei referințe moi către obiect
SoftReference<Object> softRef = new SoftReference<>(data); 

// Obiectul data poate fi colectat dacă memoria este insuficientă
// Dacă obiectul nu a fost colectat, poate fi recuperat
Object retrievedData = softRef.get(); 

Referință Slabă (Weak Reference)

O referință slabă indică un obiect care poate fi colectat de colectorul de gunoi în orice moment dacă nu mai există referințe puternice către el. Referințele slabe sunt folosite frecvent pentru implementarea cache-urilor, unde elementele pot fi eliminate în cazul lipsei de memorie.

import java.lang.ref.WeakReference;

// Crearea unui obiect
Object cacheEntry = new Object(); 
// Crearea unei referințe slabe către obiect
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry); 

// Obiectul cacheEntry poate fi colectat în orice moment
// Verificarea dacă obiectul a fost colectat
if (weakRef.get() == null) { 
    // Obiectul a fost colectat
}

Referință Fantomă (Phantom Reference)

O referință fantomă este utilizată în combinație cu ReferenceQueue pentru a efectua acțiuni înainte ca obiectul să fie eliminat complet din memorie. Nu este posibil să obțineți obiectul printr-o referință fantomă (get() întotdeauna returnează null). Este folosit în principal pentru gestionarea resurselor care necesită curățare specială.

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

// Crearea unui obiect pentru urmărire
Object resource = new Object(); 
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>(); 
// Crearea unei referințe fantomă și legarea acesteia la coadă
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue); 

// Într-un fir separat, se poate monitoriza coada referenceQueue
// Când obiectul resource va fi gata de șters, referința fantomă va apărea în coadă

Caracteristici și comparație:

Tip Referință Colector de Gunoi Obiect obținut prin get() Utilizare
Referință Puternică Nu Da Utilizare normală
Referință Moale Poate colecta Da (dacă nu a fost colectat) Caching (când memoria este insuficientă)
Referință Slabă Poate colecta Da (dacă nu a fost colectat) Caching (dacă nu există referințe puternice)
Referință Fantomă Poate colecta Nu (mereu null) Curățarea resurselor înainte de ștergere (cu ReferenceQueue)