"হাই, অ্যামিগো!"

"হাই, ঋষি!"

"আচ্ছা, আপনার দিনটি কেমন ছিল?"

"ব্রিলিয়ান্ট! আজ বিলাবো আমাকে পুনরাবৃত্তির কথা বলেছে, আর এলি আমাকে দুর্বল ও নরম রেফারেন্সের কথা বলেছে।"

"সে কি আপনাকে ফ্যান্টম রেফারেন্স সম্পর্কে বলেছিল?"

"আপনি কি ফ্যান্টম রেফারেন্সের কথা বলছেন? তিনি এটি উল্লেখ করেছেন, কিন্তু বিস্তারিত ব্যাখ্যা করেননি।"

"দারুণ, তাহলে আমি আশা করি এই শূন্যস্থান পূরণ করলে আপনি কিছু মনে করবেন না।"

"অবশ্যই! আমি আনন্দের সাথে তোমার কথা শুনব, ঋষি!"

"দারুণ। তারপর শুরু করব।"

"ফ্যান্টম রেফারেন্স হল সবথেকে দুর্বল রেফারেন্স। এগুলি শুধুমাত্র তখনই কার্যকর হয় যখন কোনো বস্তুর ফ্যান্টম রেফারেন্স ছাড়া অন্য কোনো রেফারেন্স না থাকে।"

ফ্যান্টম রেফারেন্স - ১

"একটি ফ্যান্টম রেফারেন্স একটি জটিল অবজেক্ট মুছে ফেলার পদ্ধতিতে ব্যবহার করা হয়।  এটি প্রয়োজন হতে পারে যখন একটি বস্তু জাভা মেশিনের বাইরে কিছু করে, যেমন এটি নিম্ন-স্তরের 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 ফ্যান্টম রেফারেন্সে পাস করা হয় না - ফ্যান্টম রেফারেন্সের একটি বিশেষ সারিও রয়েছে।"

"কেন আমাদের এই সারি দরকার?"

"এটাই আমি আপনাকে এখন বলতে যাচ্ছি।"

"যখন আপনি একটি ফ্যান্টম রেফারেন্স দ্বারা ধারণ করা একটি বস্তুকে ধ্বংস করেন, তখন এটি ধ্বংস হয়ে যায়, কিন্তু এটি স্মৃতি থেকে মুছে ফেলা হয় না! এটি সম্পর্কে আপনি কি মনে করেন?!"

"কাজটি কেমন হচ্ছে তাহলে?"

"এখানে বেশ কয়েকটি সূক্ষ্মতা রয়েছে, তাই আমি সবচেয়ে সহজ দিয়ে শুরু করব।"

"যদি শুধুমাত্র একটি বস্তুর ফ্যান্টম রেফারেন্স থেকে যায়, তাহলে এটিই হবে:"

" ধাপ 1। পরবর্তী আবর্জনা সংগ্রহের সময়, অবজেক্টে ফাইনালাইজ() মেথড কল করা হবে। কিন্তু, যদি ফাইনালাইজ() মেথডটি ওভাররাইড না করা হয়, তাহলে এই ধাপটি এড়িয়ে যাবে, এবং ধাপ 2 অবিলম্বে কার্যকর করা হবে।"

" ধাপ 2। পরবর্তী আবর্জনা সংগ্রহের সময়, বস্তুটিকে ফ্যান্টম অবজেক্টের একটি বিশেষ সারিতে রাখা হয়। ফ্যান্টম রেফারেন্সে clear() পদ্ধতি কল করা হলে এটি এই সারি থেকে মুছে ফেলা হবে।"

"কে ডাকে? বস্তুটা মুছে গেছে, তাই না?"

"আচ্ছা, বস্তুটি সত্যিই আমাদের বিশ্বে (জাভা বিশ্ব) মারা গিয়েছিল, কিন্তু এটি অদৃশ্য হয়ে যায়নি। এটি একটি ফ্যান্টম হিসাবে রয়ে গেছে - ফ্যান্টম বস্তুর সারি এখনও এটির একটি রেফারেন্স ধারণ করে। একই রেফারেন্স কিউ যার রেফারেন্স আমরা এত সাবধানে ফ্যান্টমরেফারেন্স কনস্ট্রাক্টরের কাছে পাঠানো হয়েছে ।"

"তাহলে এই রেফারেন্স কিউ পরকালের মতো?"

"অনেক ফ্যান্টম জগতের মতো।"

"এবং একটি ফ্যান্টম অবজেক্ট শুধুমাত্র তার ফ্যান্টম রেফারেন্সে clear() কল করে মুছে ফেলা যেতে পারে।"

"আগের উদাহরণটি কীভাবে চালিয়ে যেতে হয় তা এখানে:"

ফ্যান্টম রেফারেন্স তৈরির উদাহরণ
// 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 এবং একটি close() পদ্ধতি রয়েছে
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 > উত্তরাধিকার সূত্রে প্রাপ্ত।"

"দ্বিতীয়, এই ক্লাসের একটি বিশেষ ক্লোজ () পদ্ধতি রয়েছে৷ এই পদ্ধতিটিকে কল করার প্রয়োজন থেকেই এই সমস্ত কিছু শুরু হয়েছিল৷

"তৃতীয়ত, আমরা একটি বিশেষ থ্রেড ঘোষণা করেছি: রেফারেন্স থ্রেড । এটি একটি লুপে অপেক্ষা করে যতক্ষণ না ফ্যান্টম সারিতে অন্য একটি বস্তু উপস্থিত হয়। এটি হওয়ার সাথে সাথে, থ্রেডটি ফ্যান্টম সারি থেকে বস্তুটিকে সরিয়ে দেয় এবং এর বন্ধ () পদ্ধতিতে কল করে। এবং তারপর পরিষ্কার() পদ্ধতি। এবং এটাই। ফ্যান্টম একটি ভাল পৃথিবীতে যেতে পারে। এটি আমাদের আর আমাদের সমস্যা করবে না।"

"এত আকর্ষণীয়, কিন্তু এটি সব কাজ করে।"

"আমরা আসলে মৃত বস্তুর একটি সারি ট্র্যাক করছি, এবং তারপর আমরা তাদের প্রত্যেকের জন্য একটি বিশেষ পদ্ধতি কল করতে পারি।"

"কিন্তু মনে রাখবেন, আপনি নিজেই বস্তুর পদ্ধতিটিকে কল করতে পারবেন না।  আপনি এটির একটি রেফারেন্স পেতে পারবেন না! PhantomReference এর get() পদ্ধতি সর্বদা শূন্য প্রদান করে। "

"কিন্তু আমরা ফ্যান্টম রেফারেন্সের উত্তরাধিকারী!"

"এমনকি ফ্যান্টম রেফারেন্সের একটি সাবক্লাসের ভিতরেও, get() পদ্ধতিটি শূন্য করে দেয়।"

"সুতরাং আমি কনস্ট্রাক্টরে বস্তুর একটি রেফারেন্স সংরক্ষণ করি"

"আহ। কিন্তু এই ধরনের একটি রেফারেন্স একটি শক্তিশালী রেফারেন্স হবে, এবং বস্তুটি ফ্যান্টম সারিতে শেষ হবে না!"

"ডাং। ঠিক আছে, ছেড়ে দাও। যদি এটা অসম্ভব হয়, তাহলে এটা অসম্ভব।"

"ঠিক আছে, ভাল। আমি আশা করি আপনি আজকের পাঠ থেকে মূল্যবান কিছু শিখেছেন।"

"হ্যাঁ, অনেক নতুন উপাদান ছিল। এবং আমি ভেবেছিলাম আমি ইতিমধ্যেই সবকিছু জানি। পাঠের জন্য ধন্যবাদ, ঋষি।"

"আপনাকে স্বাগতম। এটাই, আরাম করুন। তবে ভুলে যাবেন না - আজ সন্ধ্যায় আমাদের আরেকটি পাঠ আছে।"