JavaRush /Java блогы /Random-KK /Java тіліндегі анонимді сыныптар

Java тіліндегі анонимді сыныптар

Топта жарияланған
Сәлеметсіз бе! Бүгінгі сабақта біз ұялы сыныптар тақырыбын жалғастырамыз. Соңғы топтың кезегі – Java тіліндегі анонимді ішкі сыныптар. Диаграммамызға оралайық: Анонимді сыныптар - 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 an object жасап, оларға 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 жолдық code үшін. Екінші жағынан, біздің нұсқаларымыз қандай? Иә, біз мұндай «бір рет қолданылатын» сабақтарды жазғанымыз керемет емес. Бірақ мұны қалай түзете аламыз? Бұл жерде бізге көмекке анонимді ішкі сыныптар келеді ! Міне, олар біздің жағдайда қалай көрінеді:
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!");
   }
};
Бірақ біз интерфейс an objectілерін жасау мүмкін емес екенін бұрыннан білеміз! Бұл дұрыс, мүмкін емес. Шындығында, біз мұны жасамаймыз. Біз жазатын сәт:
MonitoringSystem generalModule = new MonitoringSystem() {

};
Java машинасының ішінде мыналар орын алады:
  1. Аты жоқ Java класы жасалады, ол MonitoringSystem.
  2. Компилятор мұндай классты көріп, интерфейстің барлық әдістерін енгізуді талап етеді MonitoringSystem(біз мұны 3 рет жасадық).
  3. Осы класстың бір an objectісі жасалған. Кодқа назар аударыңыз:
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