JavaRush /Java blogi /Random-UZ /Java'da anonim sinflar

Java'da anonim sinflar

Guruhda nashr etilgan
Salom! Bugungi darsda biz o'rnatilgan sinflar mavzusini ko'rib chiqishni davom ettiramiz. Navbat oxirgi guruh - Java-dagi anonim ichki sinflar. Keling, diagrammamizga qaytaylik: Anonim sinflar - 2biz oxirgi ma'ruzada gaplashgan mahalliy sinflar singari, anonim sinflar ham ichki sinflarning bir qismidir. Shuningdek, ular orasida bir nechta o'xshashlik va farqlar mavjud. Lekin birinchi navbatda, buni aniqlaylik: nima uchun ular aslida "anonim" deb ataladi? Buning uchun oddiy misolni ko'rib chiqamiz. Tasavvur qiling-a, bizda doimiy ishlaydigan va biror narsa qiladigan asosiy dastur bor. Biz ushbu dastur uchun bir nechta modullardan iborat monitoring tizimini yaratmoqchimiz. Bir modul umumiy ishlash ko'rsatkichlarini kuzatib boradi va jurnalni yuritadi, ikkinchisi xatolar jurnalida xatolarni qayd qiladi va qayd qiladi, uchinchisi shubhali faoliyatni kuzatadi: masalan, ruxsatsiz kirishga urinishlar va boshqa xavfsizlik bilan bog'liq narsalar. Uchala modul ham dasturning boshidan boshlanishi va fonda ishlashi kerakligi sababli ular uchun umumiy interfeys yaratish maqsadga muvofiqdir:
public interface MonitoringSystem {

   public void startMonitoring();
}
U 3 ta maxsus sinf tomonidan amalga oshiriladi:
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!");
   }
}
Hamma narsa tartibda bo'lganga o'xshaydi. Bizda bir nechta modullarning juda aniq tizimi mavjud. Ularning har biri o'z xatti-harakatlariga ega. Agar bizga yangi modullar kerak bo'lsa, biz ularni qo'shishimiz mumkin, chunki bizda amalga oshirish juda oson bo'lgan interfeys mavjud. Ammo bizning monitoring tizimimiz qanday ishlashi haqida o'ylab ko'raylik. Anonim sinflar - 3Aslida, biz faqat 3 ta ob'ektni yaratishimiz kerak - GeneralIndicatorsMonitoringModule, ErrorMonitoringModule, - va ularning har birida SecurityModuleusulni chaqirishimiz kerak . startMonitoring()Ya'ni, 3 ta ob'ekt yaratish va ular bo'yicha 1 usulni chaqirish kifoya.
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();
   }
}
Konsol chiqishi:

Мониторинг общих показателей стартовал!
Мониторинг отслеживания ошибок стартовал!
Мониторинг безопасности стартовал!
Va bunday kichik ish uchun biz butun tizimni yozdik: 3 sinf va bitta interfeys! Va bularning barchasi 6 qator kod uchun. Boshqa tomondan, bizning variantlarimiz qanday? Ha, biz bunday "bir martalik" darslarni yozganimiz juda zo'r emas. Lekin buni qanday tuzatishimiz mumkin? Bu erda bizga anonim ichki sinflar yordamga keladi ! Bizning holatimizda ular qanday ko'rinishga ega:
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();
   }
}
Keling, bu erda nima bo'layotganini aniqlaylik! Biz interfeys ob'ektini yaratayotganga o'xshaymiz:
MonitoringSystem generalModule = new MonitoringSystem() {

@Override
   public void startMonitoring() {
       System.out.println("Monitoring of general indicators has started!");
   }
};
Ammo biz interfeys ob'ektlarini yaratish mumkin emasligini uzoq vaqtdan beri bilamiz! To'g'ri, bu mumkin emas. Aslida, biz buni qilmaymiz. Biz yozgan vaqt:
MonitoringSystem generalModule = new MonitoringSystem() {

};
Java mashinasi ichida quyidagilar sodir bo'ladi:
  1. ni amalga oshiradigan nomsiz Java klassi yaratilgan MonitoringSystem.
  2. Bunday sinfni ko'rgan kompilyator barcha interfeys usullarini amalga oshirishni talab qiladi MonitoringSystem(biz buni 3 marta qildik).
  3. Ushbu sinfning bitta ob'ekti yaratilgan. Kodga e'tibor bering:
MonitoringSystem generalModule = new MonitoringSystem() {

};
Oxirida nuqtali vergul bor! U bir sababga ko'ra u erda turibdi. Biz bir vaqtning o'zida sinfni e'lon qilamiz (jingalak qavslar orqali) va uning ob'ektini yaratamiz. Bizning uchta ob'ektimizning har biri o'ziga xos tarzda (); usulni bekor qilgan . startMonitoring()Oxirida biz ushbu usulni ularning har birida shunchaki chaqiramiz:
generalModule.startMonitoring();
errorModule.startMonitoring();
securityModule.startMonitoring();
Konsol chiqishi:

Мониторинг общих показателей стартовал!
Мониторинг отслеживания ошибок стартовал!
Мониторинг безопасности стартовал!
Ana xolos! Biz vazifamizni bajardik: biz uchta ob'ekt yaratdik MonitoringSystem, uni uch xil usulda aniqladik va uni uch marta chaqirdik. Barcha uchta modul muvaffaqiyatli ishga tushirildi va ishlamoqda. Shu bilan birga, dasturimizning tuzilishi ancha soddalashdi! GeneralIndicatorsMonitoringModuleAxir , ErrorMonitoringModuleendi darslarni SecurityModuledasturdan butunlay olib tashlash mumkin! Bizga ular kerak emas - ularsiz ham yaxshi uddaladik. Agar bizning har bir anonim modul sinfimiz boshqa xatti-harakatlarga, boshqalarga ega bo'lmagan o'ziga xos usullarga muhtoj bo'lsa, biz ularni osongina qo'shishimiz mumkin:
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 hujjatlarida yaxshi tavsiya bor : "Agar sizga bir martalik foydalanish uchun mahalliy sinf kerak bo'lsa, anonim sinflardan foydalaning." Anonim sinf - bu to'liq huquqli ichki sinf. Shuning uchun u tashqi sinf o'zgaruvchilari, jumladan, statik va shaxsiy o'zgaruvchilarga kirish huquqiga ega:
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;
           }
       };
   }
}
Ularning mahalliy sinflar bilan umumiyligi bor: ular faqat o'zlari aniqlangan usul ichida ko'rinadi. Yuqoridagi misolda ob'ektga errorModulemetoddan tashqarida kirishga urinish main()muvaffaqiyatsiz tugadi. Anonim sinflarning "ajdodlari" dan meros qolgan yana bir muhim cheklov - ichki sinflar: anonim sinf statik o'zgaruvchilar va usullarni o'z ichiga olmaydi . getCurrentErrorsCount()Yuqoridagi misoldagi usulni statik qilishga harakat qilsak , kompilyator xatoga yo'l qo'yadi:
//error! Inner classes cannot have static declarations
public static int getCurrentErrorsCount() {

   return currentErrorsCount;
}
Statik o'zgaruvchini e'lon qilishga harakat qilsak, xuddi shunday natijaga erishamiz:
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!");
   }

};
Nihoyat, men sizga anonim darslar mavzusi bo'yicha ajoyib videoni tavsiya qilishim mumkin, unda bu mavzu iloji boricha sodda va aniq tushuntirilgan :)
Va bugungi darsimiz o'z nihoyasiga yetdi! Garchi biz o'rnatilgan sinflarning oxirgi guruhini ko'rib chiqqan bo'lsak ham, bu mavzuni hali tugatmaganmiz. Ichki sinflar haqida keyin nimani o'rganamiz? Tez orada albatta bilib olasiz! :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION