1. বৈশিষ্ট্য: গেটার এবং সেটার্স

যখন একই সময়ে কয়েক ডজন প্রোগ্রামার দ্বারা একটি বড় প্রকল্প তৈরি করা হয়, তখন তারা যদি ক্লাস ফিল্ডে সংরক্ষিত ডেটা ভিন্নভাবে পরিচালনা করে তবে প্রায়শই সমস্যা দেখা দেয়।

হয়তো লোকেরা ক্লাস ডকুমেন্টেশন বিস্তারিতভাবে অধ্যয়ন করতে ব্যর্থ হয়, অথবা সম্ভবত এটি প্রতিটি ক্ষেত্রে বর্ণনা করে না। ফলস্বরূপ, ঘন ঘন এমন পরিস্থিতি দেখা দেয় যখন একটি বস্তুর অভ্যন্তরীণ ডেটা "দুর্বৃত্ত" হয়ে যেতে পারে, বস্তুটিকে অবৈধ করে তোলে।

এই পরিস্থিতিগুলি এড়াতে, জাভাতে সমস্ত শ্রেণির ক্ষেত্র ব্যক্তিগত করার প্রথাগত । শুধুমাত্র ক্লাসের পদ্ধতিই ক্লাসের ভেরিয়েবল পরিবর্তন করতে পারে। অন্য ক্লাস থেকে কোনো পদ্ধতি সরাসরি ভেরিয়েবল অ্যাক্সেস করতে পারে না।

আপনি যদি অন্য ক্লাসগুলি আপনার ক্লাসের অবজেক্টের মধ্যে ডেটা পেতে বা পরিবর্তন করতে সক্ষম হতে চান তবে আপনাকে আপনার ক্লাসে দুটি পদ্ধতি যুক্ত করতে হবে - একটি পেতে পদ্ধতি এবং একটি সেট পদ্ধতি। উদাহরণ:

কোড বিঃদ্রঃ
class Person
{
   private String name;

   public Person(String name)
   {
      this.name = name;
   }

   public String getName()
   {
      return name;
   }

   public void setName(String name)
   {
      this.name = name;
   }
}


privateনাম ক্ষেত্র



কন্সট্রাক্টরের মাধ্যমে ক্ষেত্রের সূচনা


getName()— এই পদ্ধতিটি নাম ক্ষেত্রের মান প্রদান করে




setName()— এই পদ্ধতিটি নামের ক্ষেত্রের মান পরিবর্তন করে

অন্য কোন শ্রেণী সরাসরি নামের ক্ষেত্রের মান পরিবর্তন করতে পারে না। যদি কেউ নামের ক্ষেত্রের মান পেতে হয়, তবে তাদের একটি বস্তুর getName() পদ্ধতিতে কল করতে হবে। Personযদি কিছু কোড নামের ক্ষেত্রের মান পরিবর্তন করতে চায় তবে এটিকে একটি বস্তুর setName() পদ্ধতিতে কল করতে হবে।Person

পদ্ধতিটিকে "নাম ক্ষেত্রের জন্য গেটারgetName() " ও বলা হয় এবং পদ্ধতিটিকে " নাম ক্ষেত্রের জন্য সেটার " বলা হয় ।setName()

এটি একটি খুব সাধারণ পদ্ধতির। সমস্ত জাভা কোডের 80-90% এর মধ্যে, আপনি কখনই একটি ক্লাসে সর্বজনীন ভেরিয়েবল দেখতে পাবেন না। পরিবর্তে, তাদের ঘোষণা করা হবে private(বা protected), এবং প্রতিটি ভেরিয়েবলের পাবলিক গেটার এবং সেটার থাকবে।

এই পদ্ধতিটি কোডটিকে দীর্ঘতর করে তোলে, তবে আরও নির্ভরযোগ্য।

একটি ক্লাস ভেরিয়েবলে সরাসরি অ্যাক্সেস করা হল আপনার গাড়িকে ডাবল হলুদ লাইন দিয়ে ঘুরিয়ে দেওয়ার মতো : এটি সহজ এবং দ্রুত, কিন্তু যদি সবাই এটি করে, তাহলে জিনিসগুলি সবার জন্য খারাপ হয়ে যায়।

ধরা যাক আপনি একটি শ্রেণী তৈরি করতে চান যা একটি বিন্দু ( x, y) বর্ণনা করে। একজন নবীন প্রোগ্রামার কীভাবে এটি করবেন তা এখানে:

class Point
{
   public int x;
   public int y;
}

একজন অভিজ্ঞ জাভা প্রোগ্রামার কীভাবে এটি করবেন তা এখানে:

কোড
class Point {
   private int x;
   private int y;

   public Point(int x, int y) {
      this.x = x;
      this.y = y;
   }

   public int getX() {
      return x;
   }

   public void setX(int x) {
      this.x = x;
   }

   public int getY() {
      return y;
   }

   public void setY(int y) {
      this.y = y;
   }
}

কোড কি আর লম্বা? নিঃসন্দেহে।

কিন্তু আপনি গেটার এবং সেটারের জন্য প্যারামিটার বৈধতা যোগ করতে পারেন। উদাহরণস্বরূপ, আপনি নিশ্চিত করতে পারেন যে xএবং yসর্বদা শূন্যের চেয়ে বড় (বা শূন্যের চেয়ে কম নয়)। উদাহরণ:

কোড বিঃদ্রঃ
class Point {
   private int x;
   private int y;

   public Point(int x, int y) {
      this.x = x < 0 ? 0 : x;
      this.y = y < 0 ? 0 : y;
   }

   public int getX() {
      return x;
   }

   public void setX(int x) {
      this.x = x < 0 ?  0 : x;
   }

   public int getY() {
      return y;
   }

   public void setY(int y) {
      this.y = y < 0 ? 0 : y;
   }
}


2. অবজেক্ট জীবনকাল

আপনি ইতিমধ্যেই জানেন যে newঅপারেটর ব্যবহার করে বস্তু তৈরি করা হয়, কিন্তু কিভাবে বস্তু মুছে ফেলা হয়? তারা চিরকালের জন্য বিদ্যমান নেই. এর জন্য যথেষ্ট স্মৃতি নেই।

অনেক প্রোগ্রামিং ভাষায়, যেমন C++, deleteবস্তু মুছে ফেলার জন্য একটি বিশেষ অপারেটর আছে। কিন্তু কিভাবে জাভা এই কাজ করে?

জাভাতে, সবকিছু একটু ভিন্নভাবে সাজানো হয়। জাভা কোন ডিলিট অপারেটর নেই. এর মানে কি জাভাতে বস্তু মুছে ফেলা হয় না? না, সেগুলি অবশ্যই মুছে ফেলা হয়েছে। অন্যথায়, জাভা অ্যাপ্লিকেশানগুলি দ্রুত মেমরি ফুরিয়ে যাবে, এবং কয়েক মাস ধরে কোনও বাধা ছাড়াই প্রোগ্রামগুলি চালানোর কথা বলা হবে না।

জাভাতে, অবজেক্ট মুছে ফেলা সম্পূর্ণ স্বয়ংক্রিয়। জাভা মেশিন নিজেই বস্তু মুছে ফেলার কাজ পরিচালনা করে। এই প্রক্রিয়াটিকে আবর্জনা সংগ্রহ বলা হয় এবং আবর্জনা সংগ্রহের প্রক্রিয়াটিকে আবর্জনা সংগ্রহকারী ( GC ) বলা হয়।

সুতরাং জাভা মেশিন কিভাবে একটি বস্তু মুছে ফেলতে জানে?

আবর্জনা সংগ্রাহক সমস্ত বস্তুকে "নাগালযোগ্য" এবং "অপৌঁছানো" এ ভাগ করে। যদি একটি বস্তুর অন্তত একটি রেফারেন্স থাকে, তবে এটি পৌঁছানোর যোগ্য বলে বিবেচিত হয়। যদি কোনো ভেরিয়েবল না থাকে যা কোনো বস্তুকে বোঝায়, তাহলে বস্তুটিকে পৌঁছানো যায় না বলে বিবেচিত হয় এবং আবর্জনা হিসেবে ঘোষণা করা হয়, যার মানে এটি মুছে ফেলা যেতে পারে।

জাভাতে, আপনি একটি বিদ্যমান বস্তুর একটি রেফারেন্স তৈরি করতে পারবেন না - আপনি শুধুমাত্র আপনার ইতিমধ্যে থাকা রেফারেন্সগুলি বরাদ্দ করতে পারেন। যদি আমরা একটি বস্তুর সমস্ত উল্লেখ মুছে ফেলি, তাহলে এটি চিরতরে হারিয়ে যায়।

সার্কুলার রেফারেন্স

আমরা একটি সাধারণ পাল্টা উদাহরণের উপর না আসা পর্যন্ত এই যুক্তিটি দুর্দান্ত শোনাচ্ছে: ধরুন আমাদের কাছে দুটি বস্তু রয়েছে যা একে অপরকে উল্লেখ করে (একে অপরের রেফারেন্স সংরক্ষণ করে)। অন্য কোন বস্তু এই বস্তুর রেফারেন্স সংরক্ষণ করে না।

এই বস্তু কোড থেকে অ্যাক্সেস করা যাবে না, কিন্তু তারা এখনও উল্লেখ করা হয়.

এই কারণেই আবর্জনা সংগ্রাহক বস্তুগুলিকে "রেফারেন্সড" এবং "অরিফারেন্সড" এর পরিবর্তে নাগালযোগ্য এবং নাগালের মধ্যে ভাগ করে।

নাগালের যোগ্য বস্তু

প্রথমত, 100% জীবিত বস্তুগুলি পৌঁছানোর যোগ্য তালিকায় যোগ করা হয়। উদাহরণস্বরূপ, বর্তমান থ্রেড ( Thread.current()) বা কনসোল ইনপুটস্ট্রিম ( System.in)।

তারপরে পৌঁছানো যায় এমন বস্তুর তালিকা প্রসারিত হয় এমন বস্তুগুলিকে অন্তর্ভুক্ত করার জন্য যা পৌঁছানোর যোগ্য বস্তুর প্রাথমিক সেট দ্বারা উল্লেখ করা হয়। তারপরে এই বর্ধিত সেট দ্বারা উল্লেখ করা বস্তুগুলি অন্তর্ভুক্ত করার জন্য এটি আবার প্রসারিত করা হয় এবং আরও অনেক কিছু।

এর মানে হল যে যদি এমন কিছু বস্তু থাকে যা শুধুমাত্র একে অপরকে উল্লেখ করে, কিন্তু পৌঁছানো যায় এমন বস্তু থেকে তাদের কাছে পৌঁছানোর কোন উপায় নেই, তাহলে সেই বস্তুগুলি আবর্জনা হিসাবে বিবেচিত হবে এবং মুছে ফেলা হবে।


3. আবর্জনা সংগ্রহ

মেমরি ফ্র্যাগমেন্টেশন

বস্তু মুছে ফেলার সাথে সম্পর্কিত আরেকটি গুরুত্বপূর্ণ বিষয় হল মেমরি ফ্র্যাগমেন্টেশন। আপনি যদি ক্রমাগত অবজেক্ট তৈরি করেন এবং মুছতে থাকেন, শীঘ্রই মেমরি ভারিভাবে খণ্ডিত হয়ে যাবে: দখলকৃত মেমরির ক্ষেত্রগুলি অনাগ্রহী মেমরির ক্ষেত্রগুলির সাথে ছেদ করা হবে।

ফলস্বরূপ, আমরা সহজেই এমন একটি পরিস্থিতিতে যেতে পারি যেখানে আমরা একটি বড় বস্তু তৈরি করতে পারি না (উদাহরণস্বরূপ, এক মিলিয়ন উপাদান সহ একটি অ্যারে), কারণ বিনামূল্যে মেমরির একটি বড় অংশ নেই। অন্য কথায়, বিনামূল্যে মেমরি থাকতে পারে, এমনকি এটির অনেকগুলিও, তবে বিনামূল্যে মেমরির একটি বড় সংলগ্ন ব্লক নাও থাকতে পারে

মেমরি অপ্টিমাইজেশান (ডিফ্র্যাগমেন্টেশন)

জাভা মেশিন একটি নির্দিষ্ট উপায়ে এই সমস্যার সমাধান করে। এটা এই মত কিছু দেখায়:

স্মৃতি দুটি ভাগে বিভক্ত। সমস্ত বস্তু মেমরির মাত্র এক অর্ধে তৈরি (এবং মুছে ফেলা) হয়। যখন মেমরির গর্তগুলি পরিষ্কার করার সময় আসে, প্রথমার্ধের সমস্ত বস্তু দ্বিতীয়ার্ধে অনুলিপি করা হয়। কিন্তু এগুলি একে অপরের ঠিক পাশে কপি করা হয় যাতে কোনও গর্ত না থাকে।

প্রক্রিয়া মোটামুটি এই মত দেখায়:

ধাপ 1: অবজেক্ট তৈরি করার পরে

জাভাতে আবর্জনা সংগ্রহ

ধাপ 2: "গর্ত" এর উপস্থিতি

জাভা 2 এ আবর্জনা সংগ্রহ

ধাপ 3: "গর্ত" অপসারণ

জাভা 3 এ আবর্জনা সংগ্রহ

আর সেই কারণেই আপনাকে অবজেক্ট মুছতে হবে না। জাভা মেশিন সহজভাবে সমস্ত পৌঁছানো যায় এমন বস্তুকে একটি নতুন অবস্থানে অনুলিপি করে, এবং মেমরির পুরো এলাকাটি মুক্ত করে যেখানে বস্তুগুলি সংরক্ষণ করা হত।