"ஹாய், அமிகோ!"

"ஹாய், ரிஷி!"

"சரி, உங்கள் நாள் எப்படி இருந்தது?"

"புத்திசாலித்தனம்! இன்று பிலாபோ மறுநிகழ்வு பற்றி என்னிடம் கூறினார், எல்லி என்னிடம் பலவீனமான மற்றும் மென்மையான குறிப்புகள் பற்றி கூறினார்."

"பாண்டம் ரெஃபரன்ஸ் பற்றி அவள் சொன்னாளா?"

"நீங்கள் PhantomReference பற்றி பேசுகிறீர்களா? அவள் அதைக் குறிப்பிட்டாள், ஆனால் அதை விரிவாக விளக்கவில்லை."

"நல்லது, இந்த இடைவெளியை நான் நிரப்பினால் நீங்கள் கவலைப்பட மாட்டீர்கள் என்று நம்புகிறேன்."

"நிச்சயமாக! நான் உன் பேச்சை மகிழ்ச்சியுடன் கேட்கிறேன் ரிஷி!"

"நல்லது. அப்புறம் ஆரம்பிப்பேன்."

"பாண்டம் குறிப்புகள் எல்லாவற்றிலும் பலவீனமான குறிப்புகளாகும். ஒரு பொருளுக்கு பாண்டம் குறிப்புகளைத் தவிர வேறு எந்த குறிப்பும் இல்லை என்றால் மட்டுமே அவை விளைவைக் கொண்டிருக்கும்."

பாண்டம் குறிப்பு - 1

"ஒரு சிக்கலான பொருள் நீக்குதல் செயல்முறையில் ஒரு PhantomReference பயன்படுத்தப்படுகிறது.  ஒரு பொருள் ஜாவா இயந்திரத்திற்கு வெளியே ஏதாவது செய்யும் போது இது அவசியமாக இருக்கலாம், எ.கா. அது குறைந்த-நிலை OS செயல்பாடுகளை அழைக்கும் அல்லது அதன் நிலையை ஒரு கோப்பில் எழுதும் அல்லது வேறு ஏதாவது மிக முக்கியமான ஒன்றைச் செய்யும்."

"நீங்கள் அதை எவ்வாறு பயன்படுத்தலாம் என்பதற்கான எடுத்துக்காட்டு:"

பாண்டம் குறிப்புகளை உருவாக்குவதற்கான எடுத்துக்காட்டு
// Special queue for phantom objects
ReferenceQueue<Integer> queue = new ReferenceQueue<Integer>();

// List of phantom references
ArrayList<PhantomReference<Integer>> list = new ArrayList<PhantomReference<Integer>>();

// Create 10 objects and add them to the list using phantom references
for ( int i = 0; i < 10; i++)
{
 Integer x = new Integer(i);
 list.add(new PhantomReference<Integer>(x, queue));
}

"கடைசி வரிக்கு மீண்டும் கவனத்தை ஈர்க்க விரும்புகிறேன். ஆப்ஜெக்ட் x ஆனது PhantomReference க்கு அனுப்பப்பட்டது மட்டுமல்ல - பாண்டம் குறிப்புகளின் சிறப்பு வரிசையும் உள்ளது."

"எங்களுக்கு ஏன் இந்த வரிசை தேவை?"

"அதைத்தான் நான் இப்போது உங்களுக்குச் சொல்லப் போகிறேன்."

"ஒரு பாண்டம் குறிப்பு மூலம் நீங்கள் ஒரு பொருளை அழிக்கும்போது, ​​அது அழிக்கப்படும், ஆனால் அது நினைவகத்திலிருந்து நீக்கப்படவில்லை! அதைப் பற்றி நீங்கள் என்ன நினைக்கிறீர்கள்?!"

"அப்படியானால், அது எப்படி வேலை செய்கிறது?"

"இங்கே சில நுணுக்கங்கள் உள்ளன, எனவே நான் எளிமையானவற்றுடன் தொடங்குவேன்."

"ஒரு பொருளைப் பற்றிய பாண்டம் குறிப்புகள் மட்டுமே இருந்தால், அதற்கு இதுவே நடக்கும்:"

" படி 1 . அடுத்த குப்பை சேகரிப்பின் போது, ​​பொருளின் மீது இறுதி() முறை அழைக்கப்படும். ஆனால், இறுதி() முறை மேலெழுதப்படவில்லை என்றால், இந்த படி தவிர்க்கப்பட்டு, படி 2 உடனடியாக செயல்படுத்தப்படும்."

" படி 2 . அடுத்த குப்பை சேகரிப்பின் போது, ​​பொருள் பாண்டம் பொருள்களின் சிறப்பு வரிசையில் வைக்கப்படும். தெளிவான() முறை PhantomReference இல் அழைக்கப்படும் போது அது இந்த வரிசையில் இருந்து நீக்கப்படும்."

"யார் அழைக்கிறார்கள்? பொருள் நீக்கப்பட்டது, இல்லையா?"

"நல்லது, பொருள் உண்மையில் நம் உலகில் (ஜாவா உலகம்) இறந்துவிட்டது, ஆனால் அது மறைந்துவிடவில்லை. அது ஒரு மாயத்தோற்றமாகவே உள்ளது - பாண்டம் பொருட்களின் வரிசை இன்னும் அதைக் குறிக்கிறது. அதே குறிப்புக் வரிசையை நாம் மிகவும் கவனமாகக் குறிப்பிடுகிறோம் . PhantomReference கன்ஸ்ட்ரக்டருக்கு அனுப்பப்பட்டது ."

"அப்படியென்றால் இந்த ரெஃபரன்ஸ் க்யூ பிந்தைய வாழ்க்கையைப் போன்றதா?"

"மேலும் ஒரு பாண்டம் உலகம் போன்றது."

"மேலும் ஒரு பாண்டம் பொருளை அதன் பாண்டம் குறிப்பில் தெளிவான() ஐ அழைப்பதன் மூலம் மட்டுமே நீக்க முடியும்."

"முந்தைய உதாரணத்தை எவ்வாறு தொடர்வது என்பது இங்கே:"

பாண்டம் குறிப்புகளை உருவாக்குவதற்கான எடுத்துக்காட்டு
// Special queue for phantom objects
ReferenceQueue<Integer> queue = new ReferenceQueue<Integer>();

// List of phantom references
ArrayList<PhantomReference<Integer>> list = new ArrayList<PhantomReference<Integer>>();

// Create 10 objects and add them to the list using phantom references
for ( int i = 0; i < 10; i++)
{
 Integer x = new Integer(i);
 list.add(new PhantomReference<Integer>(x, queue));
}

// Call the garbage collector and hope it will listen to us :)
// It should destroy all phantom reachable objects and put them in the queue
// of phantoms
System.gc();

// Get all objects from the queue
Reference<? extends Integer>referenceFromQueue;
while ((referenceFromQueue = queue.poll()) != null)
{
 // Display the object on the screen
 System.out.println(referenceFromQueue.get());

 // Clear the reference
 referenceFromQueue.clear();
}

"இங்கே ஏதோ நடக்கிறது என்பது எனக்குப் புரிகிறது. என்ன நடக்கிறது என்பது எனக்குப் புரிகிறது."

"ஆனால் இதை நடைமுறையில் எப்படிப் பயன்படுத்துகிறீர்கள்?"

"இதோ ஒரு சிறந்த உதாரணம்:"

பாண்டம் குறிப்புகளை உருவாக்குவதற்கான எடுத்துக்காட்டு
// Special queue for phantom objects
ReferenceQueue<Integer> queue = new ReferenceQueue<Integer>();

// List of phantom references
ArrayList<PhantomInteger> list = new ArrayList<PhantomInteger>();

// Create 10 objects and add them to the list using phantom references
for ( int i = 0; i < 10; i++)
{
 Integer x = new Integer(i);
 list.add(new PhantomInteger (x, queue));
}
இந்த நூல் பாண்டம் வரிசையை கண்காணித்து அதிலிருந்து பொருட்களை அகற்றும்
Thread referenceThread = new Thread()
{
 public void run()
 {
  while (true)
  {
   try
   {
    // Get the new object from the queue. If there is no object, then we wait!
    PhantomInteger ref = (PhantomInteger)queue.remove();
    // Call the close method on it
    ref.close();
    ref.clear();
   }
   catch (Exception ex)
   {
    // Write errors to a log
   }
  }
 }
};
// Run the thread as a daemon
referenceThread.setDaemon(true);
referenceThread.start();
இது PhantomReference மரபுரிமையாகும் மற்றும் நெருங்கிய() முறையைக் கொண்ட ஒரு வகுப்பாகும்
static class PhantomInteger extends PhantomReference<Integer>
{
 PhantomInteger(Integer referent, ReferenceQueue<? super Integer> queue)
 {
  super(referent, queue);
 }

 private void close()
 {
  System.out.println("Bad Integer totally destroyed!");
 }
}

"நாங்கள் இங்கே மூன்று விஷயங்களைச் செய்தோம்."

"முதலில், நாங்கள் PhantomInteger வகுப்பை உருவாக்கினோம், இது PhantomReference < Integer > பெறுகிறது."

"இரண்டாவது, இந்த வகுப்பில் ஒரு சிறப்பு மூடும் () முறை உள்ளது. இந்த முறையை அழைக்க வேண்டிய அவசியம்தான் இதைத் தொடங்கியது.

"மூன்றாவதாக, நாங்கள் ஒரு சிறப்புத் தொடரை அறிவித்தோம்: referenceThread . இது மறைமுக வரிசையில் மற்றொரு பொருள் தோன்றும் வரை ஒரு சுழற்சியில் காத்திருக்கிறது. இது நடந்தவுடன், நூல் மறைமுக வரிசையில் இருந்து பொருளை அகற்றி அதன் நெருங்கிய () முறையை அழைக்கிறது. பின்னர் தெளிவான() முறை. அவ்வளவுதான். பாண்டம் ஒரு சிறந்த உலகத்திற்கு செல்ல முடியும். அது இனி நம்மை தொந்தரவு செய்யாது."

"மிகவும் சுவாரஸ்யமானது, ஆனால் அது அனைத்தும் வேலை செய்தது."

"நாங்கள் உண்மையில் இறக்கும் பொருட்களின் வரிசையை கண்காணித்து வருகிறோம், பின்னர் அவை ஒவ்வொன்றிற்கும் ஒரு சிறப்பு முறையை அழைக்கலாம்."

"ஆனால் நினைவில் கொள்ளுங்கள், பொருளிலேயே முறையை நீங்கள் அழைக்க முடியாது.  நீங்கள் அதைக் குறிப்பைப் பெற முடியாது! PhantomReference's get() முறை எப்போதும் பூஜ்யமாக இருக்கும். "

"ஆனால் நாங்கள் மறைமுக குறிப்புகளைப் பெறுகிறோம்!"

"PhantomReference இன் துணைப்பிரிவிற்குள்ளும் கூட, get() முறை பூஜ்யத்தை அளிக்கிறது."

"எனவே நான் கன்ஸ்ட்ரக்டரில் உள்ள பொருளைப் பற்றிய குறிப்பை மட்டும் சேமிக்கிறேன்"

"ஆ. ஆனால் அத்தகைய குறிப்பு ஒரு வலுவான குறிப்பாக இருக்கும், மேலும் பொருள் ஒருபோதும் பாண்டம் வரிசையில் முடிவடையாது!"

"டாங். சரி, விட்டுவிடு. அது முடியாவிட்டால், அது சாத்தியமில்லை."

"சரி, நல்லது. இன்றைய பாடத்திலிருந்து நீங்கள் மதிப்புமிக்க ஒன்றைக் கற்றுக்கொண்டீர்கள் என்று நம்புகிறேன்."

"ஆமாம், நிறைய புது மெட்டீரியல் இருந்தது. எனக்கு ஏற்கனவே எல்லாம் தெரியும்னு நினைச்சேன். பாடத்துக்கு நன்றி, ரிஷி."

"நீங்கள் வரவேற்கப்படுகிறீர்கள். அவ்வளவுதான், ஓய்வெடுக்கச் செல்லுங்கள். ஆனால் மறந்துவிடாதீர்கள் - இன்று மாலை எங்களுக்கு மற்றொரு பாடம் உள்ளது."