CodeGym /جاوا بلاگ /Random-UR /گمنام کلاسز
John Squirrels
سطح
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