CodeGym/Java Blog/Acak/Kelas anonim
John Squirrels
Level 41
San Francisco

Kelas anonim

Dipublikasikan di grup Acak
anggota
Hai! Dalam pelajaran hari ini, kita akan melanjutkan untuk memeriksa topik kelas bersarang. Sekarang saatnya untuk grup terakhir: kelas dalam anonim. Mari kembali ke diagram kita: Kelas anonim - 2Seperti kelas lokal yang kita bicarakan di pelajaran sebelumnya, kelas anonim adalah sejenis kelas batin... Mereka juga memiliki beberapa persamaan dan perbedaan. Tapi pertama-tama, mari selami: mengapa tepatnya mereka disebut "anonim"? Untuk menjawab ini, perhatikan contoh sederhana. Bayangkan kita memiliki program dasar yang terus berjalan dan melakukan sesuatu. Kami ingin membuat sistem pemantauan untuk program ini, yang terdiri dari beberapa modul. Satu modul akan melacak indikator umum kinerja dan memelihara log. Yang kedua akan mendaftar dan mencatat kesalahan dalam log kesalahan. Yang ketiga akan melacak aktivitas mencurigakan: misalnya, upaya akses tidak sah dan hal-hal terkait keamanan lainnya. Karena ketiga modul pada dasarnya harus dimulai di awal program dan berjalan di latar belakang,
public interface MonitoringSystem {

   public void startMonitoring();
}
3 kelas konkret akan mengimplementasikannya:
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!");
   }
}
Tampaknya semuanya beres. Kami memiliki sistem yang cukup koheren yang terdiri dari beberapa modul. Masing-masing dari mereka memiliki perilakunya sendiri. Jika kita membutuhkan modul baru, kita dapat menambahkannya, karena kita memiliki antarmuka yang cukup mudah diimplementasikan. Tapi mari kita pikirkan bagaimana sistem pemantauan kita akan bekerja. Kelas anonim - 3Pada dasarnya, kita hanya perlu membuat 3 objek — GeneralIndicatorMonitoringModule, ErrorMonitoringModule, SecurityModule— dan memanggil startMonitoring()metode pada masing-masing objek. Artinya, yang perlu kita lakukan hanyalah membuat 3 objek dan memanggil 1 metode padanya.
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();
   }
}
Keluaran konsol:
Starting to monitor general indicators!
Starting to monitor errors!
Starting to monitor security!
Dan dengan sedikit usaha, kami telah menulis seluruh sistem: 3 kelas dan satu antarmuka! Dan semua ini untuk mencapai 6 baris kode. Di sisi lain, apa pilihan kita? Yah, tidak terlalu keren kita menulis kelas "satu kali" ini. Tapi bagaimana kita bisa memperbaikinya? Di sini kelas batin anonim datang untuk menyelamatkan kita! Inilah tampilannya dalam kasus kami:
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();
   }
}
Mari cari tahu apa yang terjadi! Sepertinya kita sedang membuat objek antarmuka:
MonitoringSystem generalModule = new MonitoringSystem() {

@Override
   public void startMonitoring() {
       System.out.println("Starting to monitor general indicators!");
   }
};
Tapi kita sudah lama tahu bahwa kita tidak bisa membuat objek antarmuka! Dan begitulah - itu tidak mungkin. Sebenarnya, bukan itu yang kami lakukan. Ketika kita menulis:
MonitoringSystem generalModule = new MonitoringSystem() {

};
berikut ini terjadi di dalam mesin Java:
  1. Kelas Java tanpa nama dibuat yang mengimplementasikan MonitoringSystemantarmuka.
  2. Ketika kompiler melihat kelas seperti itu, Anda harus mengimplementasikan semua metode antarmuka MonitoringSystem(kami melakukan ini 3 kali).
  3. Satu objek dari kelas ini dibuat. Perhatikan kodenya:
MonitoringSystem generalModule = new MonitoringSystem() {

};
Ada titik koma di akhir! Itu ada karena suatu alasan. Kami secara bersamaan mendeklarasikan kelas (menggunakan kurung kurawal) dan membuat turunannya (menggunakan ();). Masing-masing dari ketiga objek kita menimpa startMonitoring()metode dengan caranya sendiri. Akhirnya, kami cukup memanggil metode ini pada masing-masing:
generalModule.startMonitoring();
errorModule.startMonitoring();
securityModule.startMonitoring();
Keluaran konsol:
Starting to monitor general indicators!
Starting to monitor errors!
Starting to monitor security!
Itu dia! Kami mencapai tujuan kami: kami membuat tiga MonitoringSystemobjek, mengganti metode dengan tiga cara berbeda, dan memanggilnya tiga kali. Ketiga modul telah berhasil dipanggil dan berjalan. Pada saat yang sama, struktur program kami menjadi lebih sederhana! Lagi pula, kelas GeneralIndicatorMonitoringModule, ErrorMonitoringModule, dan SecurityModulesekarang dapat dihapus seluruhnya dari program! Kami tidak membutuhkan mereka — kami melakukan pekerjaan dengan baik tanpa mereka. Jika setiap kelas anonim kita memerlukan perilaku yang berbeda, misalnya metode spesifiknya sendiri yang tidak dimiliki kelas lain, kita dapat dengan mudah menambahkannya:
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 memberikan rekomendasi yang bagus : "Gunakan [kelas anonim] jika Anda perlu menggunakan kelas lokal hanya sekali." Kelas anonim adalah kelas dalam yang lengkap. Dengan demikian, ia memiliki akses ke variabel kelas eksternal, termasuk variabel statis dan 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;
           }
       };
   }
}
Mereka memiliki kesamaan dengan kelas lokal: mereka hanya terlihat di dalam metode di mana mereka dideklarasikan. Dalam contoh di atas, upaya apa pun untuk mengakses errorModuleobjek di luar main()metode akan gagal. Dan ada satu batasan penting lagi yang diwarisi oleh kelas anonim dari "leluhur" (kelas dalam) mereka: kelas anonim tidak dapat berisi variabel dan metode statis . Pada contoh di atas, jika kita mencoba membuat getCurrentErrorCount()metode statis, kompiler akan menghasilkan kesalahan:
// Error! Inner classes cannot have static declarations
public static int getCurrentErrorCount() {

   return currentErrorCount;
}
Kami mendapatkan hasil yang sama jika kami mencoba mendeklarasikan 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!");
   }

};
Dan pelajaran kita hari ini telah berakhir! Tetapi meskipun kami telah menyelidiki kelompok terakhir dari kelas bersarang, kami belum menyelesaikan topik ini. Apa lagi yang akan kita pelajari tentang kelas bersarang? Anda pasti akan segera mengetahuinya! :)
Komentar
  • Populer
  • Baru
  • Lama
Anda harus login untuk memberikan komentar
Halaman ini belum memiliki komentar