1
PERTEMUAN KE- 13
Anonymous Inner Class 1.
Tujuan •
2.
Membuat kelas di dalam kelas yang bersifat anonymous.
Teori
Seperti pada pertemuan sebelumnya, bahasa pemrograman Java mengijinkan anda mendefinisikan inner class. Ada dua tipe tambahan dari inner class. Anda dapat mendeklarasikan inner class di dalam bodi method. Class seperti ini disebut local inner class. Anda juga dapat mendeklarasikan inner class didalam bodi method tanpa memberi nama dari inner class tersebut. Class seperti ini disebut dengan anonymous inner class. Cara ini dipakai pada saat anda membuat hanya sebuah objek di dalam kelas ini, anda tidak perlu memberi nama dari kelas tersebut. Pada kenyataan pemrograman, anonymous inner class merupakan implementasi dari interface. (Interface adalah seperti kelas yang anggotanya hanya berupa deklarasi method, atau method yang tidak punya kode program). Perhatikan kembali program pada pertemuan sebelumnya (file StrukturData.java). Di kelas ini terdapat inner class dengan nama InnerIteratorGenap. Berikut potongan programnya. public class StrukturData { . . . //inner class untuk implementasi pola Iterator private class InnerIteratorGenap { //start mulai dari awal array private int lanjut = 0; public boolean hasNext() { //cek apakah elemen sekarang adalah elemen terakhir array return (lanjut <= SIZE - 1); }
} . . .
public int getNext() { //ambil nilai dalam indeks genap dari array int hasil = larikBulat[lanjut]; //teruskan ke elemen indeks genap selanjutnya lanjut += 2; return hasil; }
} Untuk menjadi anonymous inner class, kelas InnerIteratorGenap diubah menjadi interface: interface InnerIteratorGenap { public boolean hasNext(); public int getNext(); } Selanjutnya kita buat kelas yang mengimplementasikan interface ini.
bersifat
anonymous
inner
class
untuk
2 3.
Pelaksanaan Praktikum
1. Perhatikan kembali file StrukturData.java yang terdapat pada pertemuan sebelunya, seperti berikut. (yang dicetak tebal adalah yang akan diubah). Catatan: agar anda masih punya file asli StrukturData.java, sebaiknya kopi file ini menjadi file StrukturData2.java. Tentu saja ganti juga nama kelas menjadi: public class StrukturData2. (dicetak miring dalam kode di bawah). public class StrukturData2 { //ciptakan array private final static int SIZE = 15; private int[] larikBulat = new int[SIZE]; public StrukturData2() { //isi array dengan nilai bulat urut naik for (int i = 0; i < SIZE; i++) { larikBulat[i] = i; } } public void printGenap() { //cetak nilai dari indeks genap dari array InnerIteratorGenap iterator = this.new InnerIteratorGenap(); while (iterator.hasNext()) { System.out.print(iterator.getNext() + " "); } System.out.println(); } //inner class untuk implementasi pola Iterator private class InnerIteratorGenap { //start mulai dari awal array private int lanjut = 0; public boolean hasNext() { //cek apakah elemen sekarang adalah elemen terakhir array return (lanjut <= SIZE - 1); }
}
}
public int getNext() { //ambil nilai dalam indeks genap dari array int hasil = larikBulat[lanjut]; //teruskan ke elemen indeks genap selanjutnya lanjut += 2; return hasil; }
public static void main(String s[]) { //isi array dengan nilai bulat urut naik // dan cetak nilai pada indeks genap StrukturData2 sd = new StrukturData2(); sd.printGenap(); }
2. Tambahkan pada bagian paling atas file ini (di luar kelas StrukturData2) dengan kode berikut: // interface InnerIteratorGenap // seperti class, tetapi tidak mempunyai // implementasi method interface InnerIteratorGenap { public boolean hasNext(); public int getNext(); }
3
3. Hapuslah bagian inner class InnerIteratorGenap di bawah ini: //inner class untuk implementasi pola Iterator private class InnerIteratorGenap { //start mulai dari awal array private int lanjut = 0; public boolean hasNext() { //cek apakah elemen sekarang adalah elemen terakhir array return (lanjut <= SIZE - 1); }
}
public int getNext() { //ambil nilai dalam indeks genap dari array int hasil = larikBulat[lanjut]; //teruskan ke elemen indeks genap selanjutnya lanjut += 2; return hasil; }
4. Gantilah method printGenap(): (yang dicetak tebal adalah yang akan diubah) public void printGenap() { //cetak nilai dari indeks genap dari array InnerIteratorGenap iterator = this.new InnerIteratorGenap(); while (iterator.hasNext()) { System.out.print(iterator.getNext() + " "); } System.out.println(); } menjadi seperti berikut: (yang dicetak tebal adalah hasil perubahannya) public void printGenap() { //awal anonymous inner class InnerIteratorGenap iterator = new InnerIteratorGenap(){ //start mulai dari awal array private int lanjut = 0; public boolean hasNext() { //cek apakah elemen sekarang adalah elemen terakhir array return (lanjut <= SIZE - 1); } public int getNext() { //ambil nilai dalam indeks genap dari array int hasil = larikBulat[lanjut]; //teruskan ke elemen indeks genap selanjutnya lanjut += 2; return hasil; } }; // akhir anonymous inner class while (iterator.hasNext()) { System.out.print(iterator.getNext() + " "); } System.out.println(); } 5. Kompilasi dan jalankan. Perhatikan hasilnya di layar:
4
6. Seperti interface InnerIteratorGenap, buatlah interface InnerIteratorSemua di luar kelas StrukturData2 (sebaiknya pada bagian paling atas).
7. Seperti method printGenap(), buatlah method printSemua() di dalam kelas StrukturData2,
yang
didalamnya
terdapat
anonymous
inner
class
dari
implementasi interface InnerIteratorSemua. Method printSemua() digunakan untuk mencetak semua bilangan yang ada pada kelas ini.
8. Pada method main panggil method printSemua() seperti berikut: sd.printSemua();
Contoh Lain 9. Buatlah kelas InnerClassTest, seperti berikut: import import import import import
java.awt.*; java.awt.event.*; java.util.*; javax.swing.*; javax.swing.Timer;
/** * Program mendemonstrasikan anonymous inner class * penulis Cay Horstmann, * sebagian telah diubah oleh Sudarmanto */ public class InnerClassTest { public static void main(String[] args){ TalkingClock clock = new TalkingClock(); clock.start(1000, true); // menjaga program tetap berjalan sampai user memilih "Ok" JOptionPane.showMessageDialog(null, "Quit program?"); System.exit(0); }
}
/** * clock yang mencetak waktu pada interval tertentu */ class TalkingClock{ /** * Memulai clock. * @param interval: interval antar pesan(dalam milidetik) * @param beep: true maka clock membunyikan beep */ private int interval; private boolean beep; public TalkingClock(){ this.interval = 500; this.beep = false; }
5
/** Memulai clock. */ public void start(int interval, boolean beep) { this.beep = beep; ActionListener listener = new TimePrinter(); Timer t = new Timer(interval, listener); t.start(); } private class TimePrinter implements ActionListener{ public void actionPerformed(ActionEvent event){ Date now = new Date(); System.out.println("Waktu sekarang adalah: " + now); if (beep) Toolkit.getDefaultToolkit().beep(); } } }
10. Kompilasi dan jalankan. Perhatikan hasilnya di layar. 4.
Tugas
1. Ubahlah program InnerClassTest ini (bagian kelas TimePrinter) sehingga berbentuk anonymous inner class).