JavaRush /Блоги Java /Random-TG /Синфҳои беном дар Java

Синфҳои беном дар Java

Дар гурӯҳ нашр шудааст
Салом! Дар дарси имрӯза мо баррасии мавзӯи синфҳои лонаро идома медиҳем. Навбати гурухи охирин - синфхои дохorи беимзо дар 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 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. Аз тарафи дигар, имконоти мо чист? Бале, он қадар аҷиб нест, ки мо чунин дарсҳои "якдафъаина" навиштем. Аммо мо инро чӣ тавр ислоҳ карда метавонем? Дар ин ҷо синфҳои дохorи номаълум ба кӯмаки мо меоянд ! Ин аст, ки онҳо дар ҳолати мо чӣ гунаанд:
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() {

};
Дар дохor мошини Java инҳо рӯй медиҳанд:
  1. Синфи Java-и беном сохта шудааст, ки MonitoringSystem.
  2. Компилятор чунин синфро дида, аз шумо талаб мекунад, ки ҳамаи усулҳои интерфейсро татбиқ кунед MonitoringSystem(мо ин корро 3 маротиба кардем).
  3. Як an objectи ин синф сохта шудааст. Ба code диққат диҳед:
MonitoringSystem generalModule = new MonitoringSystem() {

};
Дар охир нуктаи вергул мавҷуд аст! Вай барои як сабаб дар он ҷо истодааст. Мо ҳамзамон синфро эълон мекунем (тавассути қавсҳои ҷингила) ва an objectи онро бо истифода аз Ҳар яке аз се an objectи мо ба таври худ (); як методро бекор кардааст . startMonitoring()Дар охир мо ин усулро дар ҳар яки онҳо меномем:
generalModule.startMonitoring();
errorModule.startMonitoring();
securityModule.startMonitoring();
Натиҷаи консол:

Мониторинг общих показателей стартовал!
Мониторинг отслеживания ошибок стартовал!
Мониторинг безопасности стартовал!
Ҳамааш ҳамин! Мо вазифаи худро иҷро кардем: мо се an object офаридем 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;
           }
       };
   }
}
Онҳо бо синфҳои маҳаллӣ як чизи умумӣ доранд: онҳо танҳо дар дохor усуле, ки дар он муайян карда шудаанд, намоёнанд. Дар мисоли боло, ҳама гуна кӯшиши дастрасӣ ба an objectи 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