JavaRush /Java Blogu /Random-AZ /Java-da anonim dərslər

Java-da anonim dərslər

Qrupda dərc edilmişdir
Salam! Bugünkü dərsimizdə yuvalanmış siniflər mövzusuna baxmağa davam edəcəyik. Növbə sonuncu qrupdadır - Java-da anonim daxili siniflər. Gəlin diaqramımıza qayıdaq: Anonim siniflər - 2Keçən mühazirədə bəhs etdiyimiz yerli siniflər kimi, anonim siniflər də daxili siniflərin bir hissəsidir. Onların da bir sıra oxşar və fərqli cəhətləri var. Ancaq əvvəlcə bunu anlayaq: niyə onlar əslində "anonim" adlanırlar? Bunun üçün sadə bir misala baxaq. Təsəvvür edin ki, bizdə daim işləyən və nəsə edən əsas proqram var. Biz bu proqram üçün bir neçə moduldan ibarət monitorinq sistemi yaratmaq istəyirik. Bir modul ümumi performans göstəricilərini izləyəcək və jurnal saxlayacaq, ikincisi səhvlər jurnalında səhvləri qeyd edəcək və qeyd edəcək, üçüncüsü şübhəli fəaliyyətə nəzarət edəcək: məsələn, icazəsiz giriş cəhdləri və digər təhlükəsizliklə əlaqəli şeylər. Hər üç modul əslində proqramın əvvəlində başlamalı və arxa planda işləməli olduğundan, onlar üçün ümumi interfeys yaratmaq yaxşı fikirdir:
public interface MonitoringSystem {

   public void startMonitoring();
}
O, 3 xüsusi sinif tərəfindən həyata keçiriləcək:
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!");
   }
}
Deyəsən hər şey qaydasındadır. Bir neçə moduldan ibarət kifayət qədər aydın sistemimiz var. Onların hər birinin öz davranışı var. Əgər bizə yeni modullar lazımdırsa, biz onları əlavə edə bilərik, çünki bizim həyata keçirmək olduqca asan olan interfeysimiz var. Ancaq gəlin, bizim monitorinq sistemimizin necə işləyəcəyini düşünək. Анонимные классы - 3Prinsipcə, biz sadəcə 3 obyekt yaratmalıyıq - GeneralIndicatorsMonitoringModule, ErrorMonitoringModule, SecurityModule- və startMonitoring()onların hər biri üçün bir metod çağırmalıyıq. Yəni 3 obyekt yaratmaq və onlar üzərində 1 metodu çağırmaq kifayətdir.
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 çıxışı:

Мониторинг общих показателей стартовал!
Мониторинг отслеживания ошибок стартовал!
Мониторинг безопасности стартовал!
Və belə kiçik bir iş üçün bütöv bir sistem yazdıq: 3 sinif və bir interfeys! Və bütün bunlar 6 sətir kod xatirinə. Digər tərəfdən, bizim seçimlərimiz nələrdir? Bəli, belə "birdəfəlik" dərslər yazmağımız o qədər də gözəl deyil. Bəs bunu necə düzəldə bilərik? Burada anonim daxili siniflər köməyimizə gəlir ! Bizim vəziyyətimizdə onlar necə görünür:
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();
   }
}
Gəlin burada nə baş verdiyini anlayaq! Görünür, biz interfeys obyekti yaradırıq:
MonitoringSystem generalModule = new MonitoringSystem() {

@Override
   public void startMonitoring() {
       System.out.println("Monitoring of general indicators has started!");
   }
};
Ancaq biz çoxdan bilirik ki, interfeys obyektləri yaratmaq mümkün deyil! Düzdü, mümkün deyil. Əslində, biz bunu etmirik. Yazdığımız an:
MonitoringSystem generalModule = new MonitoringSystem() {

};
Java maşınının içərisində aşağıdakılar baş verir:
  1. . MonitoringSystem_
  2. Kompilyator belə bir sinfi görən bütün interfeys üsullarını həyata keçirməyi tələb edir MonitoringSystem(biz bunu 3 dəfə etdik).
  3. Bu sinfin bir obyekti yaradılmışdır. Koda diqqət yetirin:
MonitoringSystem generalModule = new MonitoringSystem() {

};
Sonda nöqtəli vergül var! Bir səbəbə görə orada dayanır. Biz eyni vaxtda bir sinif elan edirik (buruq mötərizələr vasitəsilə) və onun obyektini istifadə edərək yaradırıq. (); Üç obyektimizin hər biri metodu startMonitoring()özünəməxsus şəkildə ləğv edib. Sonda onların hər biri üçün bu metodu çağırırıq:
generalModule.startMonitoring();
errorModule.startMonitoring();
securityModule.startMonitoring();
Konsol çıxışı:

Мониторинг общих показателей стартовал!
Мониторинг отслеживания ошибок стартовал!
Мониторинг безопасности стартовал!
Hamısı budur! Tapşırığımızı tamamladıq: üç obyekt yaratdıq MonitoringSystem, onu üç fərqli şəkildə yenidən təyin etdik və üç dəfə çağırdıq. Hər üç modul uğurla işə salınıb və işləyir. Eyni zamanda, proqramımızın strukturu çox sadələşdi! GeneralIndicatorsMonitoringModuleAxı , dərslər ErrorMonitoringModuleindi SecurityModuleproqramdan tamamilə silinə bilər! Onlara sadəcə ehtiyacımız yoxdur - onlarsız yaxşı bacardıq. Əgər anonim modul siniflərimizin hər biri bəzi fərqli davranışlara, digərlərində olmayan özünəməxsus metodlara ehtiyac duyarsa, biz onları asanlıqla əlavə edə bilərik:
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 sənədlərinin yaxşı bir tövsiyəsi var : "Birdəfəlik istifadə üçün yerli sinfə ehtiyacınız varsa, anonim siniflərdən istifadə edin." Anonim sinif tam hüquqlu daxili sinifdir. Beləliklə, o, statik və özəl olanlar da daxil olmaqla, xarici sinif dəyişənlərinə çıxışı var:
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;
           }
       };
   }
}
Onların yerli siniflərlə ortaq cəhətləri var: onlar yalnız müəyyən olunduğu metodun daxilində görünür. Yuxarıdakı misalda errorModulemetoddan kənar obyektə daxil olmaq cəhdi main()uğursuz olacaq. Anonim siniflərin öz “əcdadlarından” miras qalmış daha bir mühüm məhdudiyyəti – daxili siniflər: anonim sinif statik dəyişənləri və metodları ehtiva edə bilməz . getCurrentErrorsCount()Yuxarıdakı misaldan metodu statik etməyə çalışsaq , kompilyator xəta verəcək:
//error! Inner classes cannot have static declarations
public static int getCurrentErrorsCount() {

   return currentErrorsCount;
}
Statik dəyişəni elan etməyə çalışsaq, eyni nəticəni alırıq:
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!");
   }

};
Nəhayət, sizə anonim dərslər mövzusunda əla video tövsiyə edə bilərəm, burada bu mövzu mümkün qədər sadə və aydın şəkildə izah olunur :)
Və bugünkü dərsimiz başa çatdı! İçəridə qurulmuş siniflərin son qrupunu əhatə etsək də, bu mövzunu hələ bitirməmişik. İç-içə siniflər haqqında bundan sonra nə öyrənəcəyik? Siz mütləq tezliklə öyrənəcəksiniz! :)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION