Java-ში რა სახის ბმულები არსებობს და რა თვისებები აქვთ?
sobes.tech AI
პასუხი AI-სგან
Java-да үш негізгі сілтеме түрі бар (сілтеме айнымалылары), олар жад жинағыштың мінез-құлқына әсер етеді:
- Қатты сілтеме (Strong Reference)
- Мягкий сілтеме (Soft Reference)
- Слабый сілтеме (Weak Reference)
- Фантом сілтеме (Phantom Reference)
Қатты сілтеме (Strong Reference)
Бұл ең кең таралған сілтеме түрі. Қатты сілтеме көрсететін объект жад жинағышпен жиналмайды, егер оған кем дегенде бір қатты сілтеме болса.
// Объект құру және оған қатты сілтеме жасау
Object myObject = new Object();
Мягкий сілтеме (Soft Reference)
Мягкий сілтеме объектке көрсетеді, ол жад жетіспеген жағдайда жиналуы мүмкін. Тек жұмсақ сілтемелермен көрсетілетін объектілер жиналмайды, егер жад жетіспесе. Әдетте кэштеу үшін пайдаланылады.
import java.lang.ref.SoftReference;
// Объект құру
Object data = new Object();
// Объектіге жұмсақ сілтеме жасау
SoftReference<Object> softRef = new SoftReference<>(data);
// Егер жад жетіспесе, объект жиналуы мүмкін
// Егер жиналмаса, оны қайта алуға болады
Object retrievedData = softRef.get();
Слабый сілтеме (Weak Reference)
Слабый сілтеме объектке көрсетеді, ол жад жинағышпен кез келген уақытта жиналуы мүмкін, егер оған басқа сілтемелер болмаса. Әдетте кэштерді жүзеге асыру үшін пайдаланылады.
import java.lang.ref.WeakReference;
// Объект құру
Object cacheEntry = new Object();
// Объектіге әлсіз сілтеме жасау
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry);
// Объект жиналуы мүмкін
// Жиналғанын тексеру
if (weakRef.get() == null) {
// Объект жиналды
}
Фантом сілтеме (Phantom Reference)
Фантом сілтеме ReferenceQueue-мен бірге пайдаланылады, ол объект толық жойылмай тұрып әрекеттер жасауға мүмкіндік береді. get() әрқашан null қайтарады. Әдетте ресурстарды басқару үшін пайдаланылады.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
// Қадағалау үшін объект құру
Object resource = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
// Фантом сілтемені құрып, оны кезекке байлау
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue);
// бөлек ағында referenceQueue-ны бақылауға болады
// Объект resource толық жойылуға дайын болғанда, фантом сілтеме кезекке түседі
Артықшылықтары мен салыстыру:
| Сілтеме түрі | Жад жинағыш | get() арқылы объектіні алу |
Қолданылуы |
|---|---|---|---|
| Қатты сілтеме | Жиналмайды | Иә | Қалыпты қолдану |
| Мягкий сілтеме | Жиналуы мүмкін | Иә (жиналмаса) | Кэштеу (жад жетіспегенде) |
| Слабый сілтеме | Жиналуы мүмкін | Иә (жиналмаса) | Кэштеу (қатты сілтемелер болмаса) |
| Фантом сілтеме | Жиналуы мүмкін | Жоқ (әрқашан null) | Ресурстарды жою алдында тазалау (ReferenceQueue-пен) |