CodeGym /Blog Jawa /Acak /Kelas anonim
John Squirrels
tingkat
San Francisco

Kelas anonim

Diterbitake ing grup
Hi! Ing wulangan dina iki, kita bakal terus nliti topik kelas bersarang. Saiki wektune kanggo klompok pungkasan: kelas batin anonim. Ayo bali menyang diagram kita: Kelas anonim - 2Kaya kelas lokal sing kita rembugan ing wulangan pungkasan, kelas anonim minangka jinis kelas batin ... Dheweke uga duwe sawetara persamaan lan beda. Nanging pisanan, ayo nyilem: kenapa padha diarani "anonim"? Kanggo njawab iki, nimbang conto prasaja. Mbayangno yen kita duwe program dhasar sing terus-terusan mlaku lan nindakake apa wae. Kita pengin nggawe sistem ngawasi kanggo program iki, digawe saka sawetara modul. Siji modul bakal nglacak indikator kinerja umum lan njaga log. Kapindho bakal ndhaptar lan ngrekam kesalahan ing log kesalahan. Katelu bakal nglacak kegiatan sing curiga: contone, upaya akses sing ora sah lan barang-barang liyane sing gegandhengan karo keamanan. Amarga kabeh telung modul kudu, ing intine, mung diwiwiti ing wiwitan program lan mbukak ing latar mburi,

public interface MonitoringSystem {
  
   public void startMonitoring();
}
3 kelas konkrit bakal ngetrapake:

public class GeneralIndicatorMonitoringModule implements MonitoringSystem {
   
@Override
   public void startMonitoring() {
       System.out.println("Starting to monitor general indicators!");
   }
}


public class ErrorMonitoringModule implements MonitoringSystem {

   @Override
   public void startMonitoring() {
       System.out.println("Starting to monitor errors!");
   }
}


public class SecurityModule implements MonitoringSystem {

   @Override
   public void startMonitoring() {
       System.out.println("Starting to monitor security!");
   }
}
Iku bakal katon sing kabeh wis supaya. Kita duwe sistem sing koheren sing digawe saka sawetara modul. Saben-saben nduweni tingkah lakune dhewe-dhewe. Yen kita butuh modul anyar, kita bisa nambah, amarga kita duwe antarmuka sing gampang diimplementasikake. Nanging ayo dipikirake kepiye sistem ngawasi bisa digunakake. Kelas anonim - 3Sejatine, kita mung kudu nggawe 3 obyek — GeneralIndicatorMonitoringModule, ErrorMonitoringModule, SecurityModule— lan nelpon startMonitoring()cara ing saben wong. Yaiku, kabeh sing kudu ditindakake yaiku nggawe 3 obyek lan nelpon 1 metode.

public class Main {

   public static void main(String[] args) {

       GeneralIndicatorMonitoringModule generalModule = new GeneralIndicatorMonitoringModule();
       ErrorMonitoringModule errorModule = new ErrorMonitoringModule();
       SecurityModule securityModule = new SecurityModule();

       generalModule.startMonitoring();
       errorModule.startMonitoring();
       securityModule.startMonitoring();
   }
}
Output konsol:

Starting to monitor general indicators! 
Starting to monitor errors! 
Starting to monitor security!
Lan kanthi karya cilik kasebut, kita wis nulis kabeh sistem: 3 kelas lan siji antarmuka! Lan kabeh iki kanggo entuk 6 baris kode. Ing sisih liya, apa pilihan kita? Ya, ora apik banget yen kita nulis kelas "sepisan". Nanging kepiye carane bisa ndandani iki? Ing kene kelas batin anonim teka kanggo ngluwari kita! Mangkene apa sing katon ing kasus kita:

public class Main {

   public static void main(String[] args) {

       MonitoringSystem generalModule = new MonitoringSystem() {
           @Override
           public void startMonitoring() {
               System.out.println("Starting to monitor general indicators!");
           }
       };

       

MonitoringSystem errorModule = new MonitoringSystem() {
           @Override
           public void startMonitoring() {
               System.out.println("Starting to monitor errors!");
           }
       };

       MonitoringSystem securityModule = new MonitoringSystem() {
           @Override
           public void startMonitoring() {
               System.out.println("Starting to monitor security!");
           }
       };

       generalModule.startMonitoring();
       errorModule.startMonitoring();
       securityModule.startMonitoring();
   }
}
Ayo ngerteni apa sing kedadeyan! Katon kaya kita nggawe obyek antarmuka:

MonitoringSystem generalModule = new MonitoringSystem() {
   
@Override
   public void startMonitoring() {
       System.out.println("Starting to monitor general indicators!");
   }
};
Nanging kita wis suwe ngerti yen kita ora bisa nggawe obyek antarmuka! Lan dadi - iku mokal. Nyatane, dudu sing kita lakoni. Nalika kita nulis:

MonitoringSystem generalModule = new MonitoringSystem() {
   
};
ing ngisor iki kedadeyan ing mesin Java:
  1. Kelas Java sing ora dijenengi digawe sing ngleksanakake MonitoringSystemantarmuka.
  2. Nalika compiler ndeleng kelas kuwi, sampeyan kudu ngleksanakake kabeh cara antarmuka MonitoringSystem(kita nindakake iki 3 kaping).
  3. Siji obyek saka kelas iki digawe. Pay manungsa waé menyang kode:

MonitoringSystem generalModule = new MonitoringSystem() {
   
};
Ana titik koma ing pungkasan! Iku ana kanggo alesan. Kita bebarengan ngumumake kelas kasebut (nggunakake kurung kriting) lan nggawe conto kasebut (nggunakake ();). Saben telu obyek kita ngatasi startMonitoring()cara kasebut kanthi cara dhewe. Pungkasan, kita mung nelpon metode iki kanggo saben wong:

generalModule.startMonitoring();
errorModule.startMonitoring();
securityModule.startMonitoring();
Output konsol:

Starting to monitor general indicators! 
Starting to monitor errors! 
Starting to monitor security!
Mekaten! Kita entuk tujuane: nggawe telung MonitoringSystemobyek, ngatasi metode kanthi telung cara, lan diarani kaping telu. Kabeh telung modul wis kasil disebut lan mlaku. Ing wektu sing padha, struktur program kita dadi luwih gampang! Sawise kabeh, GeneralIndicatorMonitoringModule, ErrorMonitoringModule, lan SecurityModulekelas saiki bisa dibusak saka program! Kita ora butuh wong-wong mau - kita nindakake tugas sing apik tanpa dheweke. Yen saben kelas anonim mbutuhake sawetara prilaku sing beda-beda, contone, metode tartamtu dhewe sing ora diduweni dening wong liya, kita bisa kanthi gampang nambahake:

MonitoringSystem generalModule = new MonitoringSystem() {
  
   @Override
   public void startMonitoring() {
       System.out.println("Starting to monitor general indicators!");
   }
  
   public void someSpecificMethod() {

       System.out.println("Specific method only for the first module");
   }
};
Dokumentasi Oracle menehi rekomendasi sing apik : "Gunakake [kelas anonim] yen sampeyan kudu nggunakake kelas lokal mung sapisan." Kelas anonim minangka kelas batin sing lengkap. Dadi, nduweni akses menyang variabel kelas eksternal, kalebu variabel statis lan pribadi:

public class Main {

   private static int currentErrorCount = 23;

   public static void main(String[] args) {

       MonitoringSystem errorModule = new MonitoringSystem() {
          
           @Override
           public void startMonitoring() {
               System.out.println("Starting to monitor errors!");
           }

           public int getCurrentErrorCount() {

               return currentErrorCount;
           }
       };
   }
}
Padha duwe soko ing umum karo kelas lokal: padha katon mung nang cara kang padha ngumumaké. Ing conto ing ndhuwur, sembarang upaya kanggo ngakses errorModuleobyek ing njaba main()cara bakal gagal. Lan ana watesan sing luwih penting sing diwarisake kelas anonim saka "leluhur" (kelas batin): kelas anonim ora bisa ngemot variabel lan metode statis . Ing conto ing ndhuwur, yen kita nyoba nggawe getCurrentErrorCount()cara statis, compiler bakal ngasilake kesalahan:

// Error! Inner classes cannot have static declarations
public static int getCurrentErrorCount() {

   return currentErrorCount;
}
Kita entuk asil sing padha yen nyoba ngumumake variabel statis:

MonitoringSystem errorModule = new MonitoringSystem() {

   // Error! Inner classes cannot have static declarations!
   static int staticInt = 10;

   @Override
   public void startMonitoring() {
       System.out.println("Starting to monitor errors!");
   }

};
Lan pelajaran dina iki wis rampung! Nanging sanajan kita wis nyelidiki klompok pungkasan kelas nested, kita durung rampung topik iki. Apa maneh sing bakal kita sinau babagan kelas nested? Sampeyan mesthi bakal ngerti rauh! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION