JavaRush /Java блогу /Random-KY /Javaдагы анонимдүү класстар

Javaдагы анонимдүү класстар

Группада жарыяланган
Салам! Бүгүнкү сабакта уя класстар темасын кароону улантабыз. Кезек акыркы топко келди - Javaдагы анонимдүү ички класстар. Диаграммабызга кайрылып көрөлү: Анонимдүү класстар - 2Биз акыркы лекцияда сөз кылган жергorктүү класстар сыяктуу, анонимдүү класстар да ички класстардын бир бөлүгү болуп саналат. Ошондой эле алардын ортосунда бир нече окшоштуктар жана айырмачылыктар бар. Бирок, адегенде, аны аныктап көрөлү: эмне үчүн алар чындыгында "анонимдүү" деп аталат? Бул үчүн, жөнөкөй бир мисал карап көрөлү. Элестеткиле, бизде тынымсыз иштеп, бир нерсе жасап турган негизги программа бар. Биз бул программа үчүн бир нече модулдан турган мониторинг системасын түзгүбүз келет. Бир модул жалпы иштөө көрсөткүчтөрүн көзөмөлдөп, журналды жүргүзөт, экинчиси ката журналындагы каталарды жазып, журналга киргизет, үчүнчүсү шектүү аракеттерди көзөмөлдөйт: мисалы, уруксатсыз кирүү аракеттери жана башка коопсуздукка байланыштуу нерселер. Үч модул тең программанын башында эле башталып, фондо иштеши керек болгондуктан, алар үчүн жалпы интерфейсти түзүү жакшы идея:
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 an objectти түзүшүбүз керек - 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();
   }
}
Келгиле, бул жерде эмне болуп жатканын билели! Биз интерфейс an objectин түзүп жатабыз окшойт:
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() {

};
Аягында үтүрлүү чекит бар! Ал жерде бир себеп менен турат. Биз бир эле учурда классты жарыялайбыз (тармал кашаалар аркылуу) жана анын an objectин түзүү аркылуу (); үч an objectибиздин ар бири методду startMonitoring()өз алдынча жокко чыгарды. Акырында биз жөн гана алардын ар бирине бул ыкманы чакырабыз:
generalModule.startMonitoring();
errorModule.startMonitoring();
securityModule.startMonitoring();
Консолдук чыгаруу:

Мониторинг общих показателей стартовал!
Мониторинг отслеживания ошибок стартовал!
Мониторинг безопасности стартовал!
Баары болду! Биз тапшырмабызды аткардык: биз үч an object түздүк MonitoringSystem, аны үч түрдүү жол менен аныктадык жана үч жолу атадык. Бардык үч модулдар ийгorктүү ишке киргизилген жана иштеп жатат. Ошону менен бирге биздин программабыздын структурасы алда канча женекей болуп калды! 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 documentтеринде жакшы сунуш бар : "Эгер сизге бир жолку колдонуу үчүн жергorктүү класс керек болсо, анонимдүү класстарды колдонуңуз." Анонимдүү класс - бул толук кандуу ички класс. Ошондуктан, ал статикалык жана жеке, анын ичинде тышкы класс өзгөрмөлөр, мүмкүнчүлүгү бар:
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;
           }
       };
   }
}
Алардын жергorктүү класстар менен жалпылыгы бар: алар аныкталган методдун ичинде гана көрүнөт. Жогорудагы мисалда, errorModuleметоддон тышкары an objectке жетүү аракети main()ишке ашпай калат. Жана дагы бир маанилүү чектөө, анонимдүү класстар алардын "ата-бабаларынан" мураска калган - ички класстар: анонимдүү класс статикалык өзгөрмөлөрдү жана методдорду камтый алbyte . 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