JavaRush /جاوا بلاگ /Random-UR /جاوا میں گمنام کلاسز

جاوا میں گمنام کلاسز

گروپ میں شائع ہوا۔
ہیلو! آج کے اسباق میں ہم نیسٹڈ کلاسز کے موضوع کو دیکھتے رہیں گے۔ یہ آخری گروپ کی باری ہے - جاوا میں گمنام اندرونی کلاسز۔ آئیے اپنے خاکہ پر واپس آتے ہیں: گمنام کلاسز - 2مقامی کلاسوں کی طرح جن کے بارے میں ہم نے پچھلے لیکچر میں بات کی تھی، گمنام کلاسیں اندرونی کلاسوں کا ایک ذیلی سیٹ ہیں۔ ان کے درمیان کئی مماثلتیں اور اختلافات بھی ہیں۔ لیکن پہلے، آئیے اس کا پتہ لگائیں: انہیں اصل میں "گمنام" کیوں کہا جاتا ہے؟ ایسا کرنے کے لیے، آئیے ایک سادہ سی مثال دیکھیں۔ تصور کریں کہ ہمارے پاس ایک اہم پروگرام ہے جو مسلسل چل رہا ہے اور کچھ کر رہا ہے۔ ہم اس پروگرام کے لیے کئی ماڈیولز پر مشتمل ایک مانیٹرنگ سسٹم بنانا چاہتے ہیں۔ ایک ماڈیول عمومی کارکردگی کے اشارے کی نگرانی کرے گا اور ایک لاگ رکھے گا، دوسرا غلطی لاگ میں غلطیوں کو ریکارڈ کرے گا اور لاگ ان کرے گا، تیسرا مشتبہ سرگرمی کی نگرانی کرے گا: مثال کے طور پر، غیر مجاز رسائی کی کوششیں اور سیکیورٹی سے متعلق دیگر چیزیں۔ چونکہ تینوں ماڈیولز کو بنیادی طور پر صرف پروگرام کے آغاز سے شروع ہونا چاہیے اور پس منظر میں چلنا چاہیے، اس لیے ان کے لیے ایک مشترکہ انٹرفیس بنانا اچھا خیال ہے:
public interface MonitoringSystem {

   public void startMonitoring();
}
اسے 3 مخصوص کلاسوں کے ذریعے لاگو کیا جائے گا:
public class GeneralIndicatorsMonitoringModule implements MonitoringSystem {

@Override
   public void startMonitoring() {
       System.out.println("Monitoring of general indicators has started!");
   }
}


public class ErrorMonitoringModule implements MonitoringSystem {

   @Override
   public void startMonitoring() {
       System.out.println("Bug Tracking Monitoring Started!");
   }
}


public class SecurityModule implements MonitoringSystem {

   @Override
   public void startMonitoring() {
       System.out.println("Security monitoring started!");
   }
}
ایسا لگتا ہے کہ سب کچھ ترتیب میں ہے۔ ہمارے پاس کئی ماڈیولز کا کافی واضح نظام ہے۔ ان میں سے ہر ایک کا اپنا طرز عمل ہے۔ اگر ہمیں نئے ماڈیولز کی ضرورت ہے، تو ہم ان کو شامل کر سکتے ہیں، کیونکہ ہمارے پاس ایک انٹرفیس ہے جسے لاگو کرنا کافی آسان ہے۔ لیکن آئیے سوچتے ہیں کہ ہمارا مانیٹرنگ سسٹم کیسے کام کرے گا۔ گمنام کلاسز - 3بنیادی طور پر، ہمیں صرف 3 اشیاء بنانا چاہئے - GeneralIndicatorsMonitoringModule, ErrorMonitoringModule, SecurityModule- اور startMonitoring()ان میں سے ہر ایک پر ایک طریقہ کال کریں۔ یعنی آپ کو صرف 3 آبجیکٹ بنانے اور ان پر 1 طریقہ کال کرنے کی ضرورت ہے۔
public class Main {

   public static void main(String[] args) {

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

       generalModule.startMonitoring();
       errorModule.startMonitoring();
       securityModule.startMonitoring();
   }
}
کنسول آؤٹ پٹ:

Мониторинг общих показателей стартовал!
Мониторинг отслеживания ошибок стартовал!
Мониторинг безопасности стартовал!
اور اتنے چھوٹے کام کے لیے، ہم نے ایک پورا نظام لکھا: 3 کلاسز اور ایک انٹرفیس! اور یہ سب کوڈ کی 6 لائنوں کی خاطر۔ دوسری طرف، ہمارے اختیارات کیا ہیں؟ ہاں، یہ بہت اچھا نہیں ہے کہ ہم نے ایسی "ڈسپوزایبل" کلاسیں لکھیں۔ لیکن ہم اسے کیسے ٹھیک کر سکتے ہیں؟ یہ وہ جگہ ہے جہاں گمنام اندرونی طبقات ہماری مدد کو آتے ہیں ! ہمارے معاملے میں وہ کس طرح نظر آتے ہیں یہ یہاں ہے:
public class Main {

   public static void main(String[] args) {

       MonitoringSystem generalModule = new MonitoringSystem() {
           @Override
           public void startMonitoring() {
               System.out.println("Monitoring of general indicators has started!");
           }
       };



           MonitoringSystem errorModule = new MonitoringSystem() {
           @Override
           public void startMonitoring() {
               System.out.println("Bug Tracking Monitoring Started!");
           }
       };

       MonitoringSystem securityModule = new MonitoringSystem() {
           @Override
           public void startMonitoring() {
               System.out.println("Security monitoring started!");
           }
       };

       generalModule.startMonitoring();
       errorModule.startMonitoring();
       securityModule.startMonitoring();
   }
}
آئیے معلوم کریں کہ یہاں کیا ہو رہا ہے! ایسا لگتا ہے کہ ہم ایک انٹرفیس آبجیکٹ بنا رہے ہیں:
MonitoringSystem generalModule = new MonitoringSystem() {

@Override
   public void startMonitoring() {
       System.out.println("Monitoring of general indicators has started!");
   }
};
لیکن ہم ایک طویل عرصے سے جانتے ہیں کہ انٹرفیس اشیاء بنانا ناممکن ہے! یہ ٹھیک ہے، یہ ناممکن ہے۔ درحقیقت، ہم ایسا نہیں کرتے۔ جس لمحے ہم لکھتے ہیں:
MonitoringSystem generalModule = new MonitoringSystem() {

};
جاوا مشین کے اندر درج ذیل ہوتا ہے:
  1. ایک بے نام جاوا کلاس بنائی گئی ہے جو لاگو کرتی ہے MonitoringSystem۔
  2. کمپائلر، ایسی کلاس کو دیکھ کر، آپ سے انٹرفیس کے تمام طریقوں کو لاگو کرنے کی ضرورت ہے MonitoringSystem(ہم نے یہ 3 بار کیا)۔
  3. اس کلاس کا ایک آبجیکٹ بنایا گیا ہے۔ کوڈ پر توجہ دیں:
MonitoringSystem generalModule = new MonitoringSystem() {

};
آخر میں ایک سیمی کالون ہے! وہ وہاں ایک وجہ سے کھڑی ہے۔ ہم بیک وقت ایک کلاس کا اعلان کرتے ہیں (گھنگھریالے منحنی خطوط وحدانی کے ذریعے) اور اس کا استعمال کرتے ہوئے اس کی آبجیکٹ تخلیق کرتے ہیں (); ہماری تینوں اشیاء میں سے ہر ایک نے startMonitoring()اپنے طریقے سے ایک طریقہ کو اوور رائڈ کیا ہے۔ آخر میں ہم ان میں سے ہر ایک پر صرف اس طریقہ کو کہتے ہیں:
generalModule.startMonitoring();
errorModule.startMonitoring();
securityModule.startMonitoring();
کنسول آؤٹ پٹ:

Мониторинг общих показателей стартовал!
Мониторинг отслеживания ошибок стартовал!
Мониторинг безопасности стартовал!
بس! ہم نے اپنا کام مکمل کر لیا ہے: ہم نے تین اشیاء بنائی ہیں MonitoringSystem، اسے تین مختلف طریقوں سے دوبارہ بیان کیا ہے، اور اسے تین بار پکارا ہے۔ تینوں ماڈیولز کامیابی سے لانچ اور کام کر رہے ہیں۔ ایک ہی وقت میں، ہمارے پروگرام کی ساخت بہت آسان ہو گئی ہے! GeneralIndicatorsMonitoringModuleسب کے بعد ، کلاسز کو ErrorMonitoringModuleاب SecurityModuleپروگرام سے مکمل طور پر ہٹایا جا سکتا ہے! ہمیں صرف ان کی ضرورت نہیں ہے - ہم ان کے بغیر بالکل ٹھیک ہیں۔ اگر ہماری ہر گمنام ماڈیول کلاس کو کچھ مختلف رویے کی ضرورت ہے، اس کے اپنے مخصوص طریقے جو دوسروں کے پاس نہیں ہیں، تو ہم انہیں آسانی سے شامل کر سکتے ہیں:
MonitoringSystem generalModule = new MonitoringSystem() {

   @Override
   public void startMonitoring() {
       System.out.println("Monitoring of general indicators has started!");
   }

   public void someSpecificMethod() {

       System.out.println("Specific method for first module only");
   }
};
اوریکل دستاویزات میں ایک اچھی تجویز ہے : "اگر آپ کو ایک بار استعمال کے لیے مقامی کلاس کی ضرورت ہو تو گمنام کلاسز کا استعمال کریں۔" ایک گمنام طبقہ ایک مکمل اندرونی طبقہ ہے۔ لہذا، اسے بیرونی طبقے کے متغیرات تک رسائی حاصل ہے، بشمول جامد اور نجی:
public class Main {

   private static int currentErrorsCount = 23;

   public static void main(String[] args) {

       MonitoringSystem errorModule = new MonitoringSystem() {

           @Override
           public void startMonitoring() {
               System.out.println("Bug Tracking Monitoring Started!");
           }

           public int getCurrentErrorsCount() {

               return currentErrorsCount;
           }
       };
   }
}
ان میں مقامی کلاسوں کے ساتھ کچھ مشترک ہے: وہ صرف اس طریقہ کے اندر نظر آتے ہیں جس میں ان کی تعریف کی گئی ہے۔ errorModuleاوپر کی مثال میں، طریقہ سے باہر آبجیکٹ تک رسائی کی کوئی بھی کوشش main()ناکام ہو جائے گی۔ اور ایک اور اہم حد جو گمنام کلاسوں کو ان کے "آباؤ اجداد" سے وراثت میں ملی ہے - اندرونی کلاسز: ایک گمنام کلاس جامد متغیرات اور طریقوں پر مشتمل نہیں ہو سکتی ۔ اگر ہم اوپر دی گئی مثال سے طریقہ کو getCurrentErrorsCount()جامد بنانے کی کوشش کرتے ہیں، تو کمپائلر ایک غلطی پھینک دے گا:
//error! Inner classes cannot have static declarations
public static int getCurrentErrorsCount() {

   return currentErrorsCount;
}
اگر ہم جامد متغیر کا اعلان کرنے کی کوشش کرتے ہیں تو ہمیں وہی نتیجہ ملتا ہے:
MonitoringSystem errorModule = new MonitoringSystem() {

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

   @Override
   public void startMonitoring() {
       System.out.println("Bug Tracking Monitoring Started!");
   }

};
آخر میں، میں آپ کو گمنام کلاسز کے موضوع پر ایک بہترین ویڈیو تجویز کر سکتا ہوں، جہاں اس موضوع کو جتنا آسان اور واضح طور پر بیان کیا گیا ہے :)
اور ہمارا آج کا سبق ختم ہو گیا ہے! اور اگرچہ ہم نے نیسٹڈ کلاسز کے آخری گروپ کا احاطہ کیا ہے، ہم نے ابھی تک اس موضوع کے ساتھ کام نہیں کیا ہے۔ نیسٹڈ کلاسز کے بارے میں ہم آگے کیا مطالعہ کریں گے؟ آپ کو یقینی طور پر جلد ہی پتہ چل جائے گا! :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION