MODUL XIII,PBO 1

ANONYNOUS CLASS
 

TUJUAN:
Mahasiswa mampu membuat kelas di dalam kelas yang bersifat anonymous
TEORI SINGKAT:
Bentuk umum script program adalah sebagai berikut:
class OuterClass{
     …..
     Class NestedCalss{
     ….}
     }
}
PELAKSANAAN PRAKTIKUM:
Listing program 1. StrukturData2.java
Pada kelas ini kita hanya memodifikasi dari kelas StrukturData yang didalamnya mempunyai nested class, yaitu kelas di dalam kelas. Namun pada praktek kali ini kita akan 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 yang sering disebut sebagai 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). Program tetap akan berjalan baik apabila kelas yang didalamnya ada anonymous class pernah dicompail kemudian statemen interface dihilangkan. Hal itu karena sudah ada temporari compail sehingga interface tidak lagi digunakan. Namun apabila kita membuat anymous class baru maka interface harus ada.
//Interface InnerIteratorGenap
//seperti class, tetapi tidak mempunyai
//implementasi method
interface InnerIteratorGenap{
     public boolean hasNext();
     public int getNext();
}
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
            larikBulat[i]=i;
       }
     }
     public void printGenap(){
       //Awal Anonynous InnerClass
       InnerIteratorGenap iterator=new InnerIteratorGenap(){
            //Star mulai dari awal array
            private int lanjut=0;
            public boolean hasNext(){
                  //cek apakah elemen sekaranga dalah elemen terakhir array
                  return (lanjut<=SIZE-1);
            }
            public int getNext(){
                  //ambil nilai dalam indeks genap dari array
                  int hasil=larikBulat[lanjut];
                  //teruska ke elemen indeks genap selanjutnya
                  lanjut +=2;
                  return hasil;
            }
       };//Akhir dari anynous inner class
     while (iterator.hasNext()){
            System.out.print(iterator.getNext() + ” “);
       }
       System.out.println();
     }
     public static void main(String[]args){
       //isi array dengan nilai bulat urut naik
       //dan cetak nilai pada indeks genap
       StrukturData2 sd=new StrukturData2();
       sd.printGenap();
     }
}
Dengan memasukkan kelas InnerIteratorGenap ke dalam method printGenap() dan membuat sebuah objek iterator maka kelas yang di dalamnya terdapat variabel dan 2 buah  method yaitu hasNext() dan getNext(). Konstruktor dan method didalam anonymous class ini dapat dipanggil oleh induk kelas (kelas di luar).
Kelas anonymous ini tercipta karena adanya suatu statemen interface dalam hasa indonesia sering diartikan sebagai penghubung. Jadi dengan adanya interface ini dapat menghubungkan antara class luar dengan anonymous. Bagaimana jika kita hilangkan method yang ada di dalam interface tersebut? Bisakah kelas ini dikompiler? Ternyata tidak karena method yang mereferensi pada class anonymous tidak ada. Jadi betul bahwa interface memang akan menghubungkan method yang digunakan pada anonymous class. Jika tidak ada interface class anonymous tidak dapat diakses.
Hasilnya adalah
Kita coba. untuk memodifikasi kelas StrukturData2 di atas menjadi kelas StrukturDataSemua yang kita gunakan sebagai sarana untuk menampilkan data bilangan ganjil dan semua data. Maka kita harus membuat interface untuk anonymous kelas ganjil dan kelas semua. Selain itu kita harus membuat anonymous class ganjil dan genap pada method print. Sehingga terdapat 2 buah method tambahan yaitu method printGanjil() dan method printSemua(), sehingga pada method main method printGanjil() dan printSemua() tersebut dapat dipanggil dengan objek yang diciptakan dari kelas StrukturDataSemua.
//Interface InnerIteratorGenap
//seperti class, tetapi tidak mempunyai
//implementasi method
interface InnerIteratorSemua{
       public boolean hasNext();
       public int getNext();
}
interface InnerIteratorGanjil{
       public boolean hasNext();
       public int getNext();
}
interface InnerIteratorGenap{
       public boolean hasNext();
       public int getNext();
}
public class StrukturDataSemua{
//Ciptakan array
       private final static int SIZE=15;
       private int[] larikBulat=new int[SIZE];
       public StrukturDataSemua(){
              //Isi array dengan nilai bulat urut naik
              for (int i=0; i
                     larikBulat[i]=i;
              }
       }
//==================================================
       public void printGenap(){
              System.out.println(“”);
              System.out.println(“Tampil Bilangan Genap Saja”);
              System.out.println(“=========================================”);
              //Awal Anonynous InnerClass
              InnerIteratorGenap iterator=new InnerIteratorGenap(){
                     //Star mulai dari awal array
                     private int lanjut=0;
                     public boolean hasNext(){
                     //cek apakah elemen sekaranga dalah elemen terakhir array
                           return (lanjut<=SIZE-1);
                     }
                     public int getNext(){
                           //ambil nilai dalam indeks genap dari array
                           int hasil=larikBulat[lanjut];
                           //teruska ke elemen indeks genap selanjutnya
                           lanjut +=2;
                           return hasil;
                     }
              };//Akhir dari anynous inner class
       while (iterator.hasNext()){
                     System.out.print(iterator.getNext() + ” “);
              }
              System.out.println();
       }
//==================================================
       public void printGanjil(){
              System.out.println(“”);
              System.out.println(“Tampil Bilangan Ganjil Saja”);
              System.out.println(“=========================================”);
              //Awal Anonynous InnerClass
              InnerIteratorGanjil iterator=new InnerIteratorGanjil(){
                     //Star mulai dari awal array
                     private int lanjut=1;
                     public boolean hasNext(){
                     //cek apakah elemen sekaranga dalah elemen terakhir array
                           return (lanjut<=SIZE-1);
                     }
                     public int getNext(){
                           //ambil nilai dalam indeks genap dari array
                           int hasil=larikBulat[lanjut];
                           //teruska ke elemen indeks genap selanjutnya
                           lanjut +=2;
                           return hasil;
                     }
              };//Akhir dari anynous inner class
       while (iterator.hasNext()){
                     System.out.print(iterator.getNext() + ” “);
              }
              System.out.println();
       }
//==================================================
       public void printSemua(){
              System.out.println(“”);
              System.out.println(“Tampil Semua Bilangan “);
              System.out.println(“=========================================”);
              //Awal Anonynous InnerClass
              InnerIteratorSemua iterator=new InnerIteratorSemua(){
                     //Star mulai dari awal array
                     private int lanjut=0;
                     public boolean hasNext(){
                     //cek apakah elemen sekaranga dalah elemen terakhir array
                           return (lanjut<=SIZE-1);
                     }
                     public int getNext(){
                           //ambil nilai dalam indeks genap dari array
                           int hasil=larikBulat[lanjut];
                           //teruska ke elemen indeks genap selanjutnya
                           lanjut++;
                           return hasil;
                     }
              };//Akhir dari anynous inner class
       while (iterator.hasNext()){
                     System.out.print(iterator.getNext() + ” “);
              }
              System.out.println();
       }
//=======================================================
       public static void main(String[]args){
              //isi array dengan nilai bulat urut naik
              //dan cetak nilai pada indeks genap
              StrukturDataSemua sd=new StrukturDataSemua();
              sd.printGenap();
              sd.printGanjil();
              sd.printSemua();
       }
}
Hasilnya adalah
Mencoba kelas Timer:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import java.awt.*;
import java.awt.event.*;
import java.util.Date;
import javax.swing.*;
import javax.swing.Timer.*;
/**
* Program mendemonstrasikan anonynous inner class
* penlis Cay Horstmann
* sebagian telah diubah oleh Sudarmanto
*/
public class InnerClassTest{
     public static void main (String [] args){
       TalkingClock clock=new TalkingClock();
       clock.start(1000,true);
       //Menjalankan 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 mempunyai beep
*/
private int interval;
private boolean beep;
public TalkingClock(){
     this.interval=500;
     this.beep=false;
}
/**
Memulai clock
*/
public void start(int interval, boolean beep){
     this.beep=beep;
     TimePrinter 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();
       }
     }
}
TUGAS:
import java.awt.*;
import java.awt.event.*;
import java.util.Date;
import javax.swing.*;
import javax.swing.Timer.*;
interface TimerPrinter{
            actionPerformed(ActionEvent event);
}
public class InnerClassTest{
            public static void main (String [] args){
                   TalkingClock clock=new TalkingClock();
                   clock.start(1000,true);
                   //Menjalankan program tetap berjalan sampai user memilih “Ok”
                   JOptionPane.showMessageDialog(null,”Quit Program?”);
                   System.exit(0);
            }
}
class TalkingClock{
            private int interval;
            private boolean beep;
            public TalkingClock(){
                   this.interval=500;
                   this.beep=false;
            }
            public void start(int interval, boolean beep){
                   this.beep=beep;
                   TimePrinter listener=new TimePrinter(){
                                public void actionPerformed(ActionEvent event){
                                                Date now=new Date();
                                                System.out.println(“Waktu Sekarang adalah : “+now);
                                                if (beep) Toolkit.getDefaultToolkit().beep();
                                                }
                                };
                   Timer t=new Timer(interval, listener);
                   t.start();
            }
}
KESIMPULAN:
1.       Ketentuan dasar yang berlaku pada variabel, konstruktor dan method pada program di java berlaku pula pada inner class tersebut, yaitu:
a.       Variabel dan method pada kelas luar dapat diakses oleh kelas inner (nested class)
b.      Variabel dan method non static tidak dapat diakses oleh inner kelas static namun variabel dan method static dapat diakses oleh kelas non static.
2.       Dalam menciptakan objek sama seperti halnya dalam menciptakan objek pada kelas-kelas biasa. Agar berbeda pada pembuatan objek yang dilakukan oleh kelas luar dalam rangka memanggil suatu method yang berada dalam kelas inner. Dalam pemanggilan kita juga harus menyertakan nama kelas di belakang kelas luar sebagaimana contoh di atas:
Didalam2Kelas.Size sd2=new Didalam2Kelas.Size();
Namun istimewanya teryata di dalam kelas yang ada di dalam kita dapat menciptakan kelas lagi, sehingga sampai 2 tingkat. Sebagaimana kami coba ternyata berhasil melakukan pemanggilan method getSize() yang berada dalam kelas static class Size, kami masukkan ke dalam kelas InnerIteratorGenap di dalam kelas StrukturData2. Artinya ada 2 tingkat pertama kelas StrukturData2 kemudian kelas InnerIteratorGenap dan kelas ke tiga adalah static class Size. Yang kemudian kita panggil dengan perintah sebagaimana di bawah ini, tapi jangan lupa dalam memodifikasi tetap harus memperhatikan jenis modifier baik yang dimiliki variabel, method maupun pada kelas itu sendiri.
Didalam2Kelas.InnerIteratorGenap.Size sd2=new Didalam2Kelas.InnerIteratorGenap.Size();
Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s