JavaRush /Java Blog /Random-ID /Kelas anonim di Jawa

Kelas anonim di Jawa

Dipublikasikan di grup Random-ID
Halo! Dalam pelajaran hari ini kita akan terus melihat topik kelas bertingkat. Sekarang giliran grup terakhir - kelas dalam anonim di Jawa. Mari kita kembali ke diagram kita: Kelas anonim - 2Seperti kelas lokal yang kita bicarakan di kuliah terakhir, kelas anonim adalah bagian dari kelas dalam. Mereka juga memiliki beberapa persamaan dan perbedaan di antara mereka. Tapi pertama-tama, mari kita cari tahu: mengapa mereka disebut “anonim”? Untuk melakukan ini, mari kita lihat contoh sederhana. Bayangkan kita mempunyai program utama yang terus berjalan dan melakukan sesuatu. Kami ingin membuat sistem monitoring untuk program ini yang terdiri dari beberapa modul. Satu modul akan memantau indikator kinerja umum dan menyimpan log, modul kedua akan mencatat dan mencatat kesalahan dalam log kesalahan, modul ketiga akan memantau 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, ada baiknya untuk membuat antarmuka umum untuk ketiga modul tersebut:
public interface MonitoringSystem {

   public void startMonitoring();
}
Ini akan dilaksanakan oleh 3 kelas tertentu:
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!");
   }
}
Tampaknya semuanya beres. Kami memiliki sistem beberapa modul yang cukup jelas. Masing-masing dari mereka memiliki perilakunya sendiri. Jika kita membutuhkan modul baru, kita dapat menambahkannya, karena kita mempunyai antarmuka yang cukup mudah untuk diimplementasikan. Namun mari kita pikirkan bagaimana sistem pemantauan kita akan bekerja. Kelas anonim - 3Pada dasarnya, kita hanya perlu membuat 3 objek - GeneralIndicatorsMonitoringModule, ErrorMonitoringModule, SecurityModule- dan memanggil metode startMonitoring()pada masing-masing objek. Artinya, yang perlu Anda lakukan hanyalah membuat 3 objek dan memanggil 1 metode pada objek tersebut.
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();
   }
}
Keluaran konsol:

Мониторинг общих показателей стартовал!
Мониторинг отслеживания ошибок стартовал!
Мониторинг безопасности стартовал!
Dan untuk pekerjaan sekecil itu, kami menulis keseluruhan sistem: 3 kelas dan satu antarmuka! Dan semua ini demi 6 baris kode. Di sisi lain, apa pilihan kita? Ya, tidak terlalu keren jika kami menulis kelas “sekali pakai” seperti itu. Tapi bagaimana kita bisa memperbaikinya? Di sinilah kelas-kelas dalam anonim datang membantu 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("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();
   }
}
Mari kita cari tahu apa yang terjadi di sini! Sepertinya kita sedang membuat objek antarmuka:
MonitoringSystem generalModule = new MonitoringSystem() {

@Override
   public void startMonitoring() {
       System.out.println("Monitoring of general indicators has started!");
   }
};
Namun kita telah mengetahui sejak lama bahwa tidak mungkin membuat objek antarmuka! Itu benar, itu tidak mungkin. Faktanya, kami tidak melakukan itu. Saat kita menulis:
MonitoringSystem generalModule = new MonitoringSystem() {

};
Di dalam mesin Java hal berikut terjadi:
  1. Kelas Java yang tidak disebutkan namanya dibuat yang mengimplementasikan MonitoringSystem.
  2. Kompiler, melihat kelas seperti itu, mengharuskan Anda untuk 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! Dia berdiri di sana karena suatu alasan. Kami secara bersamaan mendeklarasikan sebuah kelas (melalui kurung kurawal) dan membuat objeknya menggunakan (); Masing-masing dari tiga objek kami telah mengganti metode startMonitoring()dengan caranya sendiri. Pada akhirnya kita cukup memanggil metode ini pada masing-masing metode:
generalModule.startMonitoring();
errorModule.startMonitoring();
securityModule.startMonitoring();
Keluaran konsol:

Мониторинг общих показателей стартовал!
Мониторинг отслеживания ошибок стартовал!
Мониторинг безопасности стартовал!
Itu saja! Kita telah menyelesaikan tugas kita: kita telah membuat tiga objek MonitoringSystem, mendefinisikannya ulang dengan tiga cara berbeda, dan memanggilnya tiga kali. Ketiga modul berhasil diluncurkan dan berfungsi. Pada saat yang sama, struktur program kami menjadi lebih sederhana! GeneralIndicatorsMonitoringModuleLagi pula , kelas ErrorMonitoringModulekini dapat SecurityModuledihapus seluruhnya dari program! Kami sama sekali tidak memerlukannya - kami dapat melakukannya dengan baik tanpanya. Jika masing-masing kelas modul anonim kita memerlukan perilaku berbeda, metode spesifiknya sendiri yang tidak dimiliki kelas lain, kita dapat dengan mudah menambahkannya:
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");
   }
};
Dokumentasi Oracle memiliki rekomendasi yang bagus : "Gunakan kelas anonim jika Anda memerlukan kelas lokal untuk penggunaan satu kali." Kelas anonim adalah kelas dalam yang lengkap. Oleh karena itu, ia memiliki akses ke variabel kelas luar, termasuk variabel statis dan privat:
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;
           }
       };
   }
}
Mereka memiliki kesamaan dengan kelas lokal: mereka hanya terlihat di dalam metode yang mendefinisikannya. Pada contoh di atas, segala upaya untuk mengakses objek errorModuledi luar metode main()akan gagal. Dan satu lagi batasan penting yang diwarisi oleh kelas anonim dari "nenek moyang" mereka - kelas dalam: kelas anonim tidak boleh berisi variabel dan metode statis . Jika kita mencoba membuat metode getCurrentErrorsCount()dari contoh di atas menjadi statis, kompiler akan memunculkan kesalahan:
//error! Inner classes cannot have static declarations
public static int getCurrentErrorsCount() {

   return currentErrorsCount;
}
Kita mendapatkan hasil yang sama jika kita 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("Bug Tracking Monitoring Started!");
   }

};
Terakhir, saya dapat merekomendasikan Anda video luar biasa tentang topik kelas anonim, di mana topik ini dijelaskan sesederhana dan sejelas mungkin :)
Dan pelajaran kita hari ini telah berakhir! Dan meskipun kita telah membahas kelompok terakhir dari kelas bertingkat, kita belum selesai dengan topik ini. Apa yang akan kita pelajari selanjutnya tentang kelas bersarang? Anda pasti akan segera mengetahuinya! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION