MODUL XIII,PBO 1

ANONYNOUS CLASS
 

TUJUAN:
Mahasiswa mampu membuat kelas di dalamkelas 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 memodifikasidari kelas StrukturData yang didalamnya mempunyai nested class, yaitu kelas didalam kelas. Namun pada praktek kali ini kita akan mendeklarasikan inner classdi dalam bodi method. Class seperti ini disebut local inner class. Anda jugadapat mendeklarasikan inner class didalam bodi method tanpa memberi nama dariinner class yang sering disebut sebagai anonymous inner class.
Cara ini dipakai pada saat anda membuathanya sebuah objek di dalam kelas ini, anda tidak perlu memberi nama dari kelastersebut. Pada kenyataan pemrograman, anonymous inner class merupakanimplementasi dari interface. (Interface adalah seperti kelas yang anggotanyahanya berupa deklarasi method, atau method yang tidak punya kode program).Program tetap akan berjalan baik apabila kelas yang didalamnya ada anonymousclass pernah dicompail kemudian statemen interface dihilangkan. Hal itu karenasudah ada temporari compail sehingga interface tidak lagi digunakan. Namunapabila kita membuat anymous class baru maka interface harus ada.
//Interface InnerIteratorGenap
//seperti class, tetapi tidak mempunyai
//implementasi method
interface InnerIteratorGenap{
     publicboolean hasNext();
     publicint getNext();
}
public class StrukturData2{
//Ciptakan array
     privatefinal static int SIZE=15;
     privateint[] larikBulat=new int[SIZE];
     publicStrukturData2(){
       //Isiarray dengan nilai bulat urut naik
       for(int i=0; i
            larikBulat[i]=i;
       }
     }
     publicvoid printGenap(){
       //AwalAnonynous InnerClass
       InnerIteratorGenapiterator=new InnerIteratorGenap(){
            //Star mulai dari awal array
            privateint lanjut=0;
            publicboolean hasNext(){
                  //cekapakah elemen sekaranga dalah elemen terakhir array
                  return(lanjut<=SIZE-1);
            }
            publicint getNext(){
                  //ambilnilai dalam indeks genap dari array
                  inthasil=larikBulat[lanjut];
                  //teruskake elemen indeks genap selanjutnya
                  lanjut+=2;
                  returnhasil;
            }
       };//Akhirdari anynous inner class
     while(iterator.hasNext()){
            System.out.print(iterator.getNext()+ ” “);
       }
       System.out.println();
     }
     publicstatic void main(String[]args){
       //isiarray dengan nilai bulat urut naik
       //dancetak nilai pada indeks genap
       StrukturData2sd=new StrukturData2();
       sd.printGenap();
     }
}
Dengan memasukkan kelas InnerIteratorGenapke dalam method printGenap() dan membuat sebuah objek iterator maka kelas yangdi dalamnya terdapat variabel dan 2 buah method yaitu hasNext() dan getNext(). Konstruktor dan method didalamanonymous class ini dapat dipanggil oleh induk kelas (kelas di luar).
Kelas anonymous ini tercipta karena adanyasuatu statemen interface dalam hasa indonesia sering diartikan sebagaipenghubung. Jadi dengan adanya interface ini dapat menghubungkan antara classluar dengan anonymous. Bagaimana jika kita hilangkan method yang ada di dalaminterface tersebut? Bisakah kelas ini dikompiler? Ternyata tidak karena methodyang mereferensi pada class anonymous tidak ada. Jadi betul bahwa interfacememang akan menghubungkan method yang digunakan pada anonymous class. Jikatidak ada interface class anonymous tidak dapat diakses.
Hasilnya adalah
Kita coba. untuk memodifikasi kelas StrukturData2di atas menjadi kelas StrukturDataSemua yang kita gunakan sebagai sarana untukmenampilkan data bilangan ganjil dan semua data. Maka kita harus membuatinterface untuk anonymous kelas ganjil dan kelas semua. Selain itu kita harusmembuat anonymous class ganjil dan genap pada method print. Sehingga terdapat 2buah method tambahan yaitu method printGanjil() dan method printSemua(),sehingga pada method main method printGanjil() dan printSemua() tersebut dapatdipanggil dengan objek yang diciptakan dari kelas StrukturDataSemua.
//InterfaceInnerIteratorGenap
//seperticlass, tetapi tidak mempunyai
//implementasimethod
interface InnerIteratorSemua{
       publicboolean hasNext();
       publicint getNext();
}
interface InnerIteratorGanjil{
       publicboolean hasNext();
       publicint getNext();
}
interfaceInnerIteratorGenap{
       public boolean hasNext();
       public int getNext();
}
publicclass StrukturDataSemua{
//Ciptakanarray
       private final static int SIZE=15;
       private int[] larikBulat=new int[SIZE];
       public StrukturDataSemua(){
              //Isi array dengan nilai bulaturut naik
              for (int i=0; i
                     larikBulat[i]=i;
              }
       }
//==================================================
       public void printGenap(){
              System.out.println(“”);
              System.out.println(“TampilBilangan Genap Saja”);
              System.out.println(“=========================================”);
              //Awal Anonynous InnerClass
              InnerIteratorGenap iterator=newInnerIteratorGenap(){
                     //Star mulai dari awalarray
                     private int lanjut=0;
                     public boolean hasNext(){
                     //cek apakah elemensekaranga dalah elemen terakhir array
                           return(lanjut<=SIZE-1);
                     }
                     public int getNext(){
                           //ambil nilai dalamindeks genap dari array
                           inthasil=larikBulat[lanjut];
                           //teruska ke elemenindeks genap selanjutnya
                           lanjut +=2;
                           return hasil;
                     }
              };//Akhir dari anynous inner class
       while (iterator.hasNext()){
                     System.out.print(iterator.getNext()+ ” “);
              }
              System.out.println();
       }
//==================================================
       publicvoid printGanjil(){
              System.out.println(“”);
              System.out.println(“TampilBilangan Ganjil Saja”);
              System.out.println(“=========================================”);
              //AwalAnonynous InnerClass
              InnerIteratorGanjiliterator=new InnerIteratorGanjil(){
                     //Starmulai dari awal array
                     privateint lanjut=1;
                     publicboolean hasNext(){
                     //cekapakah elemen sekaranga dalah elemen terakhir array
                           return(lanjut<=SIZE-1);
                     }
                     publicint getNext(){
                           //ambilnilai dalam indeks genap dari array
                           inthasil=larikBulat[lanjut];
                           //teruskake elemen indeks genap selanjutnya
                           lanjut+=2;
                           returnhasil;
                     }
              };//Akhirdari anynous inner class
       while(iterator.hasNext()){
                     System.out.print(iterator.getNext()+ ” “);
              }
              System.out.println();
       }
//==================================================
       publicvoid printSemua(){
              System.out.println(“”);
              System.out.println(“TampilSemua Bilangan “);
              System.out.println(“=========================================”);
              //AwalAnonynous InnerClass
              InnerIteratorSemuaiterator=new InnerIteratorSemua(){
                     //Starmulai dari awal array
                     privateint lanjut=0;
                     publicboolean hasNext(){
                     //cekapakah elemen sekaranga dalah elemen terakhir array
                           return(lanjut<=SIZE-1);
                     }
                     publicint getNext(){
                           //ambilnilai dalam indeks genap dari array
                           inthasil=larikBulat[lanjut];
                           //teruskake elemen indeks genap selanjutnya
                           lanjut++;
                           returnhasil;
                     }
              };//Akhirdari anynous inner class
       while(iterator.hasNext()){
                     System.out.print(iterator.getNext()+ ” “);
              }
              System.out.println();
       }
//=======================================================
       public static void main(String[]args){
              //isi array dengan nilai bulaturut naik
              //dan cetak nilai pada indeksgenap
              StrukturDataSemua sd=newStrukturDataSemua();
              sd.printGenap();
              sd.printGanjil();
              sd.printSemua();
       }
}
Hasilnya adalah
Mencoba kelas Timer:
/*
 * To changethis template, choose Tools | Templates
 * and openthe 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{
     publicstatic void main (String [] args){
       TalkingClockclock=new TalkingClock();
       clock.start(1000,true);
       //Menjalankanprogram tetap berjalan sampai user memilih “Ok”
       JOptionPane.showMessageDialog(null,”QuitProgram?”);
       System.exit(0);
     }
}
/**
* Clock yang mencetak waktu pada interval tertentu
*/
class TalkingClock{
/**
* Memulai Clock
* @param interval: interval antar pesan (dalammilidetik)
* @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;
     TimePrinterlistener=new TimePrinter();
     Timert=new Timer(interval, listener);
     t.start();
}
private class TimePrinter implementsActionListener{
     publicvoid actionPerformed(ActionEvent event){
       Datenow=new Date();
       System.out.println(“WaktuSekarang adalah : “+now);
       if(beep) Toolkit.getDefaultToolkit().beep();
       }
     }
}
TUGAS:
importjava.awt.*;
importjava.awt.event.*;
importjava.util.Date;
importjavax.swing.*;
importjavax.swing.Timer.*;
interfaceTimerPrinter{
            actionPerformed(ActionEvent event);
}
publicclass InnerClassTest{
            public static void main (String []args){
                   TalkingClock clock=newTalkingClock();
                   clock.start(1000,true);
                   //Menjalankan program tetapberjalan sampai user memilih “Ok”
                   JOptionPane.showMessageDialog(null,”QuitProgram?”);
                   System.exit(0);
            }
}
classTalkingClock{
            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=newTimePrinter(){
                                public voidactionPerformed(ActionEvent event){
                                                Datenow=new Date();
                                                System.out.println(“WaktuSekarang adalah : “+now);
                                                if(beep) Toolkit.getDefaultToolkit().beep();
                                                }
                                };
                   Timer t=new Timer(interval,listener);
                   t.start();
            }
}
KESIMPULAN:
1.      Ketentuan dasar yang berlaku pada variabel, konstruktor danmethod pada program di java berlaku pula pada inner class tersebut, yaitu:
a.      Variabel dan method pada kelas luar dapat diakses oleh kelasinner (nested class)
b.     Variabel dan method non static tidak dapat diakses oleh innerkelas static namun variabel dan method static dapat diakses oleh kelas nonstatic.
2.       Dalam menciptakan objek sama seperti halnyadalam menciptakan objek pada kelas-kelas biasa. Agar berbeda pada pembuatanobjek yang dilakukan oleh kelas luar dalam rangka memanggil suatu method yangberada dalam kelas inner. Dalam pemanggilan kita juga harus menyertakan namakelas di belakang kelas luar sebagaimana contoh di atas:
Didalam2Kelas.Size sd2=newDidalam2Kelas.Size();
Namun istimewanya teryata di dalam kelas yang ada di dalam kitadapat menciptakan kelas lagi, sehingga sampai 2 tingkat. Sebagaimana kami cobaternyata berhasil melakukan pemanggilan method getSize() yang berada dalamkelas static class Size, kami masukkan ke dalam kelas InnerIteratorGenap didalam kelas StrukturData2. Artinya ada 2 tingkat pertama kelas StrukturData2kemudian kelas InnerIteratorGenap dan kelas ke tiga adalah static class Size.Yang kemudian kita panggil dengan perintah sebagaimana di bawah ini, tapijangan lupa dalam memodifikasi tetap harus memperhatikan jenis modifier baikyang dimiliki variabel, method maupun pada kelas itu sendiri.
Didalam2Kelas.InnerIteratorGenap.Sizesd2=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