JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ گمنام ڪلاس

جاوا ۾ گمنام ڪلاس

گروپ ۾ شايع ٿيل
سلام! اڄ جي سبق ۾ اسان nested طبقن جي موضوع تي نظر رکندي. اهو آخري گروپ جو موڙ آهي - جاوا ۾ گمنام اندروني طبقن. اچو ته اسان جي ڊراگرام ڏانھن واپس وڃون: گمنام ڪلاس - 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");
   }
};
Oracle دستاويزن ۾ سٺي سفارش آهي : "جيڪڏهن توهان کي هڪ وقت جي استعمال لاءِ مقامي ڪلاس جي ضرورت هجي ته گمنام ڪلاس استعمال ڪريو." هڪ گمنام طبقو هڪ مڪمل اندروني طبقو آهي. تنهن ڪري، ان کي ٻاهرين طبقي جي متغيرن تائين رسائي آهي، جنهن ۾ جامد ۽ خانگي شامل آهن:
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