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:
Seperti 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,
Pada dasarnya, kita hanya perlu membuat 3 objek —
![Kelas anonim - 2](https://cdn.codegym.cc/images/article/70f8f1a8-373b-49b2-9a30-ce30864013e9/800.jpeg)
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 - 3](https://cdn.codegym.cc/images/article/ede131b2-177e-4029-b705-92b4a510b700/800.jpeg)
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:
- Kelas Java tanpa nama dibuat yang mengimplementasikan
MonitoringSystem
antarmuka. - Ketika kompiler melihat kelas seperti itu, Anda harus mengimplementasikan semua metode antarmuka
MonitoringSystem
(kami melakukan ini 3 kali). - 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 MonitoringSystem
objek, 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 SecurityModule
sekarang 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 errorModule
objek 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! :)
GO TO FULL VERSION