CodeGym /Java Blog /এলোমেলো /বেনামী ক্লাস
John Squirrels
লেভেল 41
San Francisco

বেনামী ক্লাস

এলোমেলো দলে প্রকাশিত
ওহে! আজকের পাঠে, আমরা নেস্টেড ক্লাসের বিষয় পরীক্ষা করা চালিয়ে যাব। এখন শেষ গ্রুপের সময়: বেনামী অভ্যন্তরীণ ক্লাস। আসুন আমাদের চিত্রে ফিরে আসি: বেনামী ক্লাস - 2আমরা গত পাঠে যে স্থানীয় ক্লাসগুলির কথা বলেছিলাম তার মতো, বেনামী ক্লাসগুলি হল এক ধরণের অভ্যন্তরীণ শ্রেণী... তাদেরও বেশ কিছু মিল এবং পার্থক্য রয়েছে। কিন্তু প্রথমে, এর মধ্যে ডুব দেওয়া যাক: কেন তাদের "বেনামী" বলা হয়? এই উত্তর দিতে, একটি সহজ উদাহরণ বিবেচনা করুন. কল্পনা করুন যে আমাদের একটি মৌলিক প্রোগ্রাম রয়েছে যা ক্রমাগত চলছে এবং কিছু করছে। আমরা এই প্রোগ্রামের জন্য একটি মনিটরিং সিস্টেম তৈরি করতে চাই, যা বেশ কয়েকটি মডিউল নিয়ে গঠিত। একটি মডিউল কর্মক্ষমতার সাধারণ সূচক ট্র্যাক করবে এবং একটি লগ বজায় রাখবে। দ্বিতীয়টি একটি ত্রুটি লগে ত্রুটিগুলি নিবন্ধন এবং রেকর্ড করবে। তৃতীয়টি সন্দেহজনক কার্যকলাপ ট্র্যাক করবে: উদাহরণস্বরূপ, অননুমোদিত অ্যাক্সেস প্রচেষ্টা এবং অন্যান্য নিরাপত্তা-সম্পর্কিত জিনিস। কারণ তিনটি মডিউলই মূলত প্রোগ্রামের শুরুতে শুরু করে ব্যাকগ্রাউন্ডে চালানো উচিত,

public interface MonitoringSystem {
  
   public void startMonitoring();
}
3টি কংক্রিট ক্লাস এটি বাস্তবায়ন করবে:

public class GeneralIndicatorMonitoringModule implements MonitoringSystem {
   
@Override
   public void startMonitoring() {
       System.out.println("Starting to monitor general indicators!");
   }
}


public class ErrorMonitoringModule implements MonitoringSystem {

   @Override
   public void startMonitoring() {
       System.out.println("Starting to monitor errors!");
   }
}


public class SecurityModule implements MonitoringSystem {

   @Override
   public void startMonitoring() {
       System.out.println("Starting to monitor security!");
   }
}
দেখে মনে হবে সবকিছু ঠিক আছে। আমাদের বেশ কয়েকটি মডিউল দিয়ে তৈরি একটি সুন্দর সুসংগত সিস্টেম রয়েছে। তাদের প্রত্যেকের নিজস্ব আচরণ আছে। আমাদের যদি নতুন মডিউলের প্রয়োজন হয়, আমরা সেগুলি যোগ করতে পারি, কারণ আমাদের একটি ইন্টারফেস রয়েছে যা বাস্তবায়ন করা বেশ সহজ। কিন্তু আমাদের মনিটরিং সিস্টেম কিভাবে কাজ করবে তা নিয়ে চিন্তা করা যাক। বেনামী ক্লাস - 3মূলত, আমাদের শুধুমাত্র 3টি অবজেক্ট তৈরি করতে হবে — GeneralIndicatorMonitoringModule, ErrorMonitoringModule, SecurityModule— এবং startMonitoring()তাদের প্রতিটিতে মেথড কল করতে হবে। অর্থাৎ, আমাদের যা করতে হবে তা হল 3টি অবজেক্ট তৈরি করা এবং তাদের উপর 1টি পদ্ধতি কল করা।

public class Main {

   public static void main(String[] args) {

       GeneralIndicatorMonitoringModule generalModule = new GeneralIndicatorMonitoringModule();
       ErrorMonitoringModule errorModule = new ErrorMonitoringModule();
       SecurityModule securityModule = new SecurityModule();

       generalModule.startMonitoring();
       errorModule.startMonitoring();
       securityModule.startMonitoring();
   }
}
কনসোল আউটপুট:

Starting to monitor general indicators! 
Starting to monitor errors! 
Starting to monitor security!
এবং এইরকম সামান্য কাজের সাথে, আমরা পুরো সিস্টেমটি লিখেছি: 3টি ক্লাস এবং একটি ইন্টারফেস! এবং এই সব অর্জন করার জন্য 6 লাইন কোড. অন্যদিকে, আমাদের বিকল্প কি? ঠিক আছে, এটা খুব ভালো নয় যে আমরা এই "এক-কালীন" ক্লাসগুলি লিখেছি। কিন্তু কিভাবে আমরা এটা ঠিক করতে পারি? এখানে বেনামী অভ্যন্তরীণ শ্রেণী আমাদের উদ্ধার করতে আসে! আমাদের ক্ষেত্রে তারা দেখতে কেমন তা এখানে:

public class Main {

   public static void main(String[] args) {

       MonitoringSystem generalModule = new MonitoringSystem() {
           @Override
           public void startMonitoring() {
               System.out.println("Starting to monitor general indicators!");
           }
       };

       

MonitoringSystem errorModule = new MonitoringSystem() {
           @Override
           public void startMonitoring() {
               System.out.println("Starting to monitor errors!");
           }
       };

       MonitoringSystem securityModule = new MonitoringSystem() {
           @Override
           public void startMonitoring() {
               System.out.println("Starting to monitor security!");
           }
       };

       generalModule.startMonitoring();
       errorModule.startMonitoring();
       securityModule.startMonitoring();
   }
}
চলুন চিন্তা করা যাক কি হচ্ছে! দেখে মনে হচ্ছে আমরা একটি ইন্টারফেস অবজেক্ট তৈরি করছি:

MonitoringSystem generalModule = new MonitoringSystem() {
   
@Override
   public void startMonitoring() {
       System.out.println("Starting to monitor general indicators!");
   }
};
কিন্তু আমরা অনেক আগে থেকেই জানি যে আমরা ইন্টারফেস অবজেক্ট তৈরি করতে পারি না! এবং তাই এটা - এটা অসম্ভব. আসলে, আমরা যা করছি তা নয়। যখন আমরা লিখি:

MonitoringSystem generalModule = new MonitoringSystem() {
   
};
জাভা মেশিনের ভিতরে নিম্নলিখিতগুলি ঘটে:
  1. একটি নামহীন জাভা ক্লাস তৈরি করা হয়েছে যা MonitoringSystemইন্টারফেসটি প্রয়োগ করে।
  2. যখন কম্পাইলার এমন একটি ক্লাস দেখে, তখন আপনাকে ইন্টারফেসের সমস্ত পদ্ধতি প্রয়োগ করতে হবে MonitoringSystem(আমরা এটি 3 বার করেছি)।
  3. এই শ্রেণীর একটি বস্তু তৈরি করা হয়। কোডে মনোযোগ দিন:

MonitoringSystem generalModule = new MonitoringSystem() {
   
};
শেষে একটি সেমিকোলন আছে! এটা একটি কারণে আছে. আমরা একই সাথে ক্লাস ঘোষণা করি (কোঁকড়া ধনুর্বন্ধনী ব্যবহার করে) এবং এটির একটি উদাহরণ তৈরি করি (ব্যবহার করে ();)। আমাদের তিনটি বস্তুর প্রত্যেকটি startMonitoring()নিজস্ব উপায়ে পদ্ধতিটিকে ওভাররাইড করে। অবশেষে, আমরা তাদের প্রতিটিতে এই পদ্ধতিটিকে কেবল কল করি:

generalModule.startMonitoring();
errorModule.startMonitoring();
securityModule.startMonitoring();
কনসোল আউটপুট:

Starting to monitor general indicators! 
Starting to monitor errors! 
Starting to monitor security!
এটাই! আমরা আমাদের উদ্দেশ্য অর্জন করেছি: আমরা তিনটি বস্তু তৈরি করেছি MonitoringSystem, তিনটি ভিন্ন উপায়ে একটি পদ্ধতিকে ওভাররড করেছি এবং এটিকে তিনবার বলেছি। তিনটি মডিউল সফলভাবে কল করা হয়েছে এবং চলছে। একই সাথে, আমাদের প্রোগ্রামের কাঠামো অনেক সহজ হয়ে গেছে! সর্বোপরি, GeneralIndicatorMonitoringModule, ErrorMonitoringModule, এবং SecurityModuleক্লাসগুলি এখন প্রোগ্রাম থেকে সম্পূর্ণরূপে সরানো যেতে পারে! আমাদের কেবল তাদের প্রয়োজন নেই - আমরা তাদের ছাড়া একটি দুর্দান্ত কাজ করেছি। যদি আমাদের প্রতিটি বেনামী ক্লাসের কিছু ভিন্ন আচরণের প্রয়োজন হয়, যেমন তার নিজস্ব নির্দিষ্ট পদ্ধতি যা অন্যদের নেই, আমরা সহজেই সেগুলি যোগ করতে পারি:

MonitoringSystem generalModule = new MonitoringSystem() {
  
   @Override
   public void startMonitoring() {
       System.out.println("Starting to monitor general indicators!");
   }
  
   public void someSpecificMethod() {

       System.out.println("Specific method only for the first module");
   }
};
ওরাকল ডকুমেন্টেশন একটি ভাল সুপারিশ প্রদান করে : "যদি আপনি শুধুমাত্র একবার স্থানীয় ক্লাস ব্যবহার করতে চান তবে [বেনামী ক্লাস] ব্যবহার করুন।" একটি বেনামী শ্রেণী একটি পূর্ণাঙ্গ অভ্যন্তরীণ শ্রেণী। তদনুসারে, এটি স্ট্যাটিক এবং প্রাইভেট ভেরিয়েবল সহ বহিরাগত শ্রেণীর ভেরিয়েবলগুলিতে অ্যাক্সেস রয়েছে:

public class Main {

   private static int currentErrorCount = 23;

   public static void main(String[] args) {

       MonitoringSystem errorModule = new MonitoringSystem() {
          
           @Override
           public void startMonitoring() {
               System.out.println("Starting to monitor errors!");
           }

           public int getCurrentErrorCount() {

               return currentErrorCount;
           }
       };
   }
}
স্থানীয় ক্লাসের সাথে তাদের কিছু মিল রয়েছে: তারা শুধুমাত্র সেই পদ্ধতিতে দৃশ্যমান হয় যেখানে তারা ঘোষণা করা হয়। উপরের উদাহরণে, পদ্ধতির errorModuleবাইরে অবজেক্ট অ্যাক্সেস করার কোনো প্রচেষ্টা main()ব্যর্থ হবে। এবং আরও একটি গুরুত্বপূর্ণ সীমাবদ্ধতা রয়েছে যে বেনামী ক্লাসগুলি তাদের "পূর্বপুরুষ" (অভ্যন্তরীণ শ্রেণী) থেকে উত্তরাধিকার সূত্রে প্রাপ্ত: একটি বেনামী শ্রেণীতে স্ট্যাটিক ভেরিয়েবল এবং পদ্ধতি থাকতে পারে না । উপরের উদাহরণে, যদি আমরা getCurrentErrorCount()পদ্ধতিটিকে স্ট্যাটিক করার চেষ্টা করি, কম্পাইলার একটি ত্রুটি তৈরি করবে:

// Error! Inner classes cannot have static declarations
public static int getCurrentErrorCount() {

   return currentErrorCount;
}
আমরা যদি একটি স্ট্যাটিক ভেরিয়েবল ঘোষণা করার চেষ্টা করি তবে আমরা একই ফলাফল পাই:

MonitoringSystem errorModule = new MonitoringSystem() {

   // Error! Inner classes cannot have static declarations!
   static int staticInt = 10;

   @Override
   public void startMonitoring() {
       System.out.println("Starting to monitor errors!");
   }

};
এবং আমাদের আজকের পাঠ শেষ হয়েছে! কিন্তু যদিও আমরা নেস্টেড ক্লাসের শেষ গ্রুপটি তদন্ত করেছি, আমরা এখনও এই বিষয়টি শেষ করতে পারিনি। নেস্টেড ক্লাস সম্পর্কে আমরা আরও কী শিখব? আপনি অবশ্যই শীঘ্রই খুঁজে পাবেন! :)
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION