JavaRush /Java Blog /Random-TK /Java-da anonim sapaklar

Java-da anonim sapaklar

Toparda çap edildi
Salam! Bu günki sapagymyzda, höwürtgelenen synplaryň mowzugyna seretmegi dowam etdireris. Iň soňky toparyň nobaty - Java-da näbelli içki synplar. Diagramma gaýdyp geleliň: Anonim synplar - 2Soňky leksiýada gürleşen ýerli synplarymyz ýaly, anonim synplar içki synplaryň bir bölegi. Olaryň arasynda birnäçe meňzeşlik we tapawut bar. Firstöne ilki bilen düşüneliň: näme üçin aslynda "näbelli" diýilýär? Munuň üçin ýönekeý bir meselä seredeliň. Yzygiderli işleýän we bir zatlar edýän esasy programmamyz bar diýip göz öňüne getiriň. Birnäçe moduldan ybarat bu programma üçin gözegçilik ulgamyny döretmek isleýäris. Bir modul umumy öndürijilik görkezijilerine gözegçilik eder we gündeligi saklar, ikinjisi säwlik ýazgysynda ýalňyşlyklary ýazga alar we üçünjisi şübheli işjeňlige gözegçilik eder: mysal üçin, rugsatsyz giriş synanyşyklary we howpsuzlyk bilen baglanyşykly beýleki zatlar. Üç modulyň hemmesi programmanyň başynda başlamaly we fonda işlemeli bolansoň, olar üçin umumy interfeýs döretmek gowy zat:
public interface MonitoringSystem {

   public void startMonitoring();
}
3 sany aýratyn synp tarapyndan amala aşyrylar:
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!");
   }
}
Hemme zat tertipli ýaly. Bizde birnäçe modul bar. Olaryň hersiniň özüni alyp barşy bar. Täze modullar gerek bolsa, goşup bileris, sebäbi ýerine ýetirmek aňsat bolan interfeýsimiz bar. Emma gözegçilik ulgamymyzyň nähili işlejekdigi barada pikir edeliň. Anonim synplar - 3Aslynda, diňe 3 obýekt döretmeli - GeneralIndicatorsMonitoringModule,, ErrorMonitoringModule- we olaryň hersine SecurityModulebir usul çagyrmaly . startMonitoring().Agny, etmeli zadyňyz 3 obýekt döretmek we olara 1 usul çagyrmak.
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 çykyşy:

Мониторинг общих показателей стартовал!
Мониторинг отслеживания ошибок стартовал!
Мониторинг безопасности стартовал!
Şeýle kiçijik iş üçin bolsa tutuş ulgam ýazdyk: 3 synp we bir interfeýs! Bularyň hemmesi 6 setir kod üçin. Başga bir tarapdan, biziň mümkinçiliklerimiz näme? Hawa, şeýle “bir gezeklik” sapaklary ýazanymyz gaty gowy däl. Emma muny nädip düzedip bileris? Ine, näbelli içki synplar bize kömek edýär ! Ine, biziň ýagdaýymyzda olaryň görnüşi:
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();
   }
}
Geliň, bu ýerde nämeleriň bolýandygyny anyklalyň! Interfeýs obýektini döredýän ýaly:
MonitoringSystem generalModule = new MonitoringSystem() {

@Override
   public void startMonitoring() {
       System.out.println("Monitoring of general indicators has started!");
   }
};
Interfaceöne interfeýs obýektlerini döretmegiň mümkin däldigini köpden bäri bilýäris! Dogry, bu mümkin däl. Aslynda, biz beýle etmeýäris. Writeazan pursatymyz:
MonitoringSystem generalModule = new MonitoringSystem() {

};
Java maşynynyň içinde aşakdakylar bolýar:
  1. Munuň ýerine ýetirilmedik Java synpy döredilýär MonitoringSystem.
  2. Düzediji, şeýle synpy görüp, ähli interfeýs usullaryny durmuşa geçirmegiňizi talap edýär MonitoringSystem(muny 3 gezek etdik).
  3. Bu synpyň bir obýekti döredildi. Koda üns beriň:
MonitoringSystem generalModule = new MonitoringSystem() {

};
Ahyrynda bir nokatly nokat bar! Ol bir sebäp bilen şol ýerde dur. Şol bir wagtyň özünde synpy yglan edýäris (egri ýaýlar arkaly) we (); üç obýektimiziň hersini özbaşdak usul bilen startMonitoring()ýok edýäris. Netijede, bu usuly olaryň hersine atlandyrýarys:
generalModule.startMonitoring();
errorModule.startMonitoring();
securityModule.startMonitoring();
Konsol çykyşy:

Мониторинг общих показателей стартовал!
Мониторинг отслеживания ошибок стартовал!
Мониторинг безопасности стартовал!
Bu hemmesi! Wezipämizi tamamladyk: üç zady döretdik MonitoringSystem, üç dürli görnüşde kesgitledik we üç gezek atlandyrdyk. Üç modulyň hemmesi üstünlikli işe girizilýär we işleýär. Şol bir wagtyň özünde programmamyzyň gurluşy has ýönekeýleşdi! GeneralIndicatorsMonitoringModuleGalyberse-de , ErrorMonitoringModuleindi sapaklary SecurityModuleprogrammadan düýbünden aýryp bolýar! Olara diňe zerurlyk ýok - biz olarsyz gowy işledik. Anonim modul synplarymyzyň hersine başga bir häsiýet, beýlekileriň ýok aýratynlyklary gerek bolsa, olary aňsatlyk bilen goşup bileris:
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 resminamalarynyň gowy maslahaty bar : "Bir gezek ulanmak üçin ýerli synp gerek bolsa, anonim synplary ulanyň." Anonim synp doly hukukly içki synpdyr. Şonuň üçin daşarky synp üýtgeýjilerine, şol sanda statiki we hususy üýtgeýänlere girip biler:
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;
           }
       };
   }
}
Localerli synplar bilen umumy bir zady bar: olar diňe kesgitlenen usulyň içinde görünýär. Aboveokardaky mysalda, errorModuleusulyň daşyndaky obýekte girmek synanyşygy main()şowsuz bolar. Anonim synplaryň “ata-babalaryndan” miras galan has möhüm çäklendirmesi - içki synplar: anonim synpda statiki üýtgeýjiler we usullar bolup bilmez . Usuly statiki ýokardaky mysaldan düzmäge synanyşsak getCurrentErrorsCount(), düzüji ýalňyşlyk goýberer:
//error! Inner classes cannot have static declarations
public static int getCurrentErrorsCount() {

   return currentErrorsCount;
}
Statik üýtgeýjini yglan etjek bolsak, şol bir netijäni alarys:
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!");
   }

};
Ahyrynda, bu mowzuk mümkin boldugyça ýönekeý we düşnükli düşündirilýän, näbelli synplar mowzugynda ajaýyp wideo maslahat berip bilerin :)
Bu günki sapagymyz tamamlandy! Iň soňky höwürtge synplaryny gurşap alsak-da, entek bu mowzuk bilen tamamlanmadyk. Öýlenen sapaklar hakda indiki näme öwreneris? Soonakyn wagtda taparsyňyz! :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION