INTERFACE Interface adalah kumpulan method yang memuad deklarasi dan struktur method, juga field-field tanpa detail implementasinya. Interface digunakan bila ingin mengaplikasikan suatu method yang spesifik (bukan dari pewarisan kelas), interface bersifat disisipkan (embedded) pada program, dan programmer diberikan keleluasaan untuk merancang dan mendefinisikan sendiri detail prosesnya. Kelas dan Interface fundamental yang dijadikan library referential dikenal dengan istilah API (Application Programming Interface). Secara umum sebuah interface dideklarasikan dengan perintah : interface namaInterface [extends parentInterface] { [deklarasi field-dield(konstanta)] [deklarasi method-method] } Mendeklarasikan method dalam interface mirip dengan mendeklarasikan method abstract, dimana deklarasi method tidak diakhiri pasangan kurung kurawal, melainkan tanda titik koma (;) return-type namaMethod ([daftar parameter]) Field-field yang didefinisikan pada interface secara otomatis bersifat static dan final, yang berarti mereka hanya bertindak sebagai konstanta. Sedangkan secara umum, suatu class dibuat agar mengimplementasi suatu interface dengan cara sebagai berikut : class namaClass [extends parentClass] [implements interface1, interface2,...]{ [deklarasi field-field] [deklarasi method-method milik class ini] [deklarasi method-method yang terdefinisi pada interface-interface yang di implementasi oleh class tersebut] } Contoh : import java.awt.*; import java.awt.event.*; import java.awt.event.MouseListener; public class AustinPower extends Frame implements MouseListener { Button behave; public static void main (String args[]) { AustinPower spyWhoShaggedMe = new AustinPower(); spyWhoShaggedMe.setSize(100,100); spyWhoShaggedMe.setVisible(true); } public AustinPower() { behave = new Button ("I Am a Button"); behave.addMouseListener(this); add(behave); } public void mouseEntered(MouseEvent me) { behave.setLabel ("Click me...!!!"); } public void mouseExited(MouseEvent me) { behave.setLabel ("Bye...Bye...!!!"); } public void mousePressed(MouseEvent me){} public void mouseReleased(MouseEvent me){} public void mouseClicked(MouseEvent me){} } Gambar 1. Deklarasi Interface MouseListener PBO/Ayuliana/Revisi 2009
1
package java.awt.event; import java.util.EventListener; /** * The listener interface for receiving mouse event on a component. * @version 1.7 07/01/98 * @author Carl Quinn */ public interface MouseListener extends EventListener { public void mouseClicked (MouseEvent e); public void mousePressed (MouseEvent e); public void mouseReleased (MouseEvent e); public void mouseEntered (MouseEvent e); public void mouseExited (MouseEvent e); } Gambar 2. Penggunaan Interface MouseListener Output :
Pada contoh diatas, dengan mengimplementasikan MouseListener, class AustinPower dikatakan menandatangani kontrak yang menyatakan bahwa ia mampu menunjukkan kelakuan-kelakuan seorang MouseListener (yaitu bereaksi terhadap event-event yang berhubungan dengan mouse) Semua method yang terdefininisi pada interface bersifat abstrak, tidak ada implementasinya. Salah satu konsekuensi dari totalitas abstraksi pada interface adalah semua method yang tertera pada interface harus diimplementasikan oleh implementor. Perbedaan antara interface dengan abstract class, yaitu interface merupakan solusi atas prinsip multiple inheritance. Misalkan Terdapat class MouseDropper yang memiliki method-method abstract seperti pada MouseListener. Apa bedanya AustinPower extends MouseDropper dengan AustinPower implements MouseListener ? Pada perintah extends menyiratkan adanya garis keturunan sedangkan perintah implements tidak. Perhatikan contoh deklarasi berikut : class Raka extends Manusia implements Dosen, Snipper { ........ } tetapi tidak berlaku untuk deklarasi berikut : class Raka extends Manusia, Sapi { ........ } POLYMORPHISM Polymorphism didefinisikan sebagai kemampuan beberapa objek bertipe sama bereaksi secara berbeda terhadap message yang sama, perhatikan contoh berikut : 1 2 3 4 5 6 7 8 9
public class KattParty { public static void main (String args[]) { Katt[] kandangKatt = new Katt[3]; kandangKatt[0] = new Anggora(); kandangKatt[1] = new Siam(); kandangKatt[2] = new Katt(); for (int I = 0 ; I < 3 ; I++) { kandangKatt[I].speak(); } } } Gambar 3. Pesta Kucing
PBO/Ayuliana/Revisi 2009
2
Output : Katt Constructor Katt Constructor Siam Constructor Katt Constructor Miaww…. Mmurrr….Mmurrr…. Miaww…. Disetiap iterasi pada loop diatas, pada dasarnya dikirimkan pesan yang sama ke objek-objek yang bertipe sama (yaitu Katt, sesuai dengan definisi array pada baris 3), speak(). Walaupun begitu, ternyata masing-masing bereaksi dengan caranya sendiri-sendiri. Contoh lain dari polymorphism yaitu, misalkan dibuat aplikasi client/server, dimana client mengirimkan objek-objek Katt (dan tentunya bisa juga apapun turunan Katt) ke server. Pada kasus tersebut, server bersedia menerima Kat-Kat itu tanpa terlalu mempermasalahkan perbedaan spesifikasinya. Untuk itu kode diserver bisa jadi seperti berikut: … Katt k = null; while (true) { k = receive(); }… Tentunya untuk kasus ini, tidaklah tepat jika secara static mengasosiasikan k dengan class Siam (misal dengan pendeklarasian Siam k = null). Pada kode diatas, pengasosiasian k dengan class spesifik (Anggora, Siam atau lainnya) dilakukan pada saat run-time, yaitu ketika return Value dari pemanggilan receive() di-assign ke k. Itulah yang disebut dynamic/late binding.
Operator Instanceof Bagaimana seandainya pihak server ingin mengetahui type spesifik dari objek Katt yang diterimanya ? lihat contoh KattParty yang dimodifikasi berikut : 1 2 3 4 5 6 7 8 9 10
11 12 13
14 15 16
public class KattParty2 { public static void main (String args[]) { Katt[] kandangKatt = new Katt[3]; kandangKatt[0] = new Anggora(); kandangKatt[1] = new Siam(); kandangKatt[2] = new Katt(); for (int I = 0 ; I < 3 ; I++) { kandangKatt[I].speak(); if (kandangKatt[I] instanceof Siam) { System.out.println("Wow,It's a Siam...!");} else if (kandangKatt[I] instanceof Anggora) { System.out.println("Look,they sent us Anggora...!"); } else { System.out.println("Well...It could be Lucifer, or Alleys,"+ " or Regular Katt"); System.out.println("But one thing for sure...it's Katt," + " Praise the Lord"); } } } Gambar 4. To know more about Katt
}
Output : Katt Constructor Katt Constructor Siam Constructor Katt Constructor Miaww…. Look, they sent us Anggora…! Mmurrr….Mmurrr…. Wow, I’s a Siam…! Miaww…. Well…it could be Lucifer, or Alleys, or Regular Katt But one thing for sure… it’s Katt, Praise the Lord Operator yang dipakai adalah instanceof. A instanceof B, mengevaluai apakah objek A bertipe B (B adalah nama class). Evaluasi itu menghasilkan nilai true jika nama class dari objek A adalah B atau nama parent/grandparent/greatgrandparent /seterusnya dari class dari objek A adalah B. PBO/Ayuliana/Revisi 2009
3
Evaluasi juga akan bernilai benar jika B adalah nama interface dan A mengimplementasikan B. Begitu pula jika parent/grandparent/greatgrandparent/seterusnya dari class objek A mengimplementasi B. Singkat kata. jika A instanceof B menghasilkan true, berarti objek A dapat menunjukkan behavior yang di syaratkan oleh class atau interface B.
PACKAGE Dalam penyimpanan file biasanya dengan mengelompokkan class-class (dan juga interface-interface) yang terkait (karena jenisnya/fungsinya/alasan lain) dalam sebuah package. Misalkan class-class geometris berikut dikumpulkan dalam sebuah package bernama com.raka.geoms /*simpan sebagai Graphic.java */ package com.raka.geoms; public abstract class Shape { ……. } Gambar 5. Package---1 /* Simpan sebagai Rectangle java */ package com.raka.geoms; public class Rectangle extends Shape { …………… } Gambar 6. Package---2 /* Simpan sebagai Triangle.java */ package com.raka.geoms; public class Triangle extends Shape { …………… } Gambar 7. Package---3 Beberapa keuntungan mengorganisasi class-class buatan kita dalam sebuah package adalah : 1. Terhindar dari konflik penamaan. Mungkin saja ada orang lain, dibelahan dunia lain, membuat class yang bernama Rectangle juga. Yang membedakan antara Rectangle kita dengan yang lain adalah fully qualified name. Fully qualified name dari class Rectangle kita adalah com.raka.geoms.Rectangle. 2. Teratur. Mendapatkan suatu class tertentu akan mudah dengan mengetahui nama package-nya. Pada contoh diatas, masing-masing anggota dari package com.raka.geoms disimpan di file terpisah, dan dideklarasikan sebagai public. dengan demikian class/program lain (yang bukan anggota com.raka.geoms) dapat mengimport clas-class kita diatas. Kita juga dapat mendefinisikan beberapa class sekaligus dalam sebuah file java, seperti contoh berikut : /* Simpan sebagai NuclearWarHead.java */ package com.raka.lethal; public class NuclearWarHead { …………… } class Sarin { …………………. } class Uzi { …………………. } Gambar 8. All in Life Jika dikompilasi NuclearWarHead.java diatas, maka akan didapatkan tiga file class, yaitu NuclearWarHead.class,Sarin.class, Uzi.class. Kesemuanya akan menjadi anggota dari package com.raka.lethal. Akan tetapi hanya NuclearWarHead yang bisa digunakan secara langsung dari luar package com.raka.lethal, karena hanya NuclearWarHead yang dideklarasikan sebagai public, selebihnya dideklarasikan sebagai protected (defaultnya), sehingga hanya dapat digunakan oleh class-class yang tergabung didalam com.raka.lethal. Sekarang untuk menggunakan class-class yang terdapat pada com.raka.geoms dari luar com.raka.geoms, dengan menggunakan kata kunci import. Seperti contoh dibawah ini :
PBO/Ayuliana/Revisi 2009
4
package com.drawworks.threedee; import com.raka.geoms.*; …… public class Cube { …… Rectangle r = new Rectangle (); ….. } ….. Gambar 9. Mengimpor class. Jika pemrogram com.drawworks.threedee bermaksud menggunakan class-class yang terdapat pada java.awt juga dimana terdapat juga class Rectangle, maka saat inilah digunakan fully qualified name. seperti contoh dibawah ini : package com.drawworks.threedee; import com.raka.geoms.*; import java.awt.*; …… public class ThreeWorld extends Canvas { …… com.raka.geoms.Rectangle r = new com.raka.geoms.Rectangle (); ….. } ….. Gambar 10. Fully Qualified Name Package-package didalam harddisk dapat diorganisasikan dalam suatu struktur direktori. File-file class anggota com.raka.geoms terkumpul dalam struktur direktori. Dapat diambil kesimpulan bahwa tiap-tiap suku kata pada nama package adalah nama sebuah direktori.
PBO/Ayuliana/Revisi 2009
5