GUI Event Handling
8.1 Tujuan
Pada modul ini, Anda akan belajar bagaimana mengendalikan events triggered ketika
user berinteraksi dengan aplikasi GUI Anda. Setelah menyelesaikan modul ini, Anda
akan dapat mengembangkan aplikasi GUI yang dapat merespon interaksi user.
Pada akhir pembahasan, diharapkan pembaca dapat :
1. Menerangkan komponen-komponen delegation event model
2. Mengerti bagaimana delegation event model bekerja
3. Menciptakan aplikasi GUI yang berinteraksi dengan user
4. Mendiskusikan manfaat dari class-class adapter
5. Mendiskusikan keuntungan-keuntungan dari menggunakan inner dan anonymous
class
8.2 Delegation Event Model
Delegasi event model menguraikan bagaimana program Anda dapat merespon interaksi
dari user. Untuk memahami model, pertama-tama mari kita pelajari melalui tiga
komponen utamanya.
1. Event Source
Event source mengacu pada komponen GUI yang meng-generate event. Sebagai
contoh, jika user menekan tombol, event source dalam hal ini adalah tombol.
2. Event Listener/Handler
Event listener menerima berita dari event-event dan proses-proses interaksi user.
Ketika tombol ditekan, listener akan mengendalikan dengan menampilkan sebuah
informasi yang berguna untuk user.
3. Event Object
Ketika sebuah event terjadi (misal, ketika user berinteraksi dengan komponen GUI),
sebuah object event diciptakan. Object berisi semua informasi yang perlu tentang
event yang telah terjadi. Informasi meliputi tipe dari event yang telah terjadi, seperti
ketika mouse telah di-klik. Ada beberapa class event untuk kategori yang berbeda
dari user action. Sebuah event object mempunyai tipe data mengenai salah satu dari
class ini.
J.E.N.I.
Pengenalan Pemrograman 2 2
Di bawah ini adalah delegation event model.
Gambar 8.1: Delegation Event Model
Pada awalnya, sebuah listener seharusnya diregistrasikan dengan sebuah source
sehingga dapat menerima informasi tentang event-event yang terjadi pada source
tersebut. Hanya listener yang sudah teregistrasi yang dapat menerima pemberitahuan
event-event. Ketika telah teregistrasi, sebuah listener hanya tinggal menunggu sampai
event terjadi.
Ketika sesuatu terjadi dengan event source, sebuah event object akan menguraikan
event yang diciptakan. Event kemudian ditembak oleh source pada listener yang
teregistrasi.
Saat listener menerima sebuah event object (pemberitahuan) dari source, dia akan
bekerja. Menerjemahkan pemberitahuan dan memproses event yang terjadi.
J.E.N.I.
Pengenalan Pemrograman 2 3
8.2.1 Registrasi Listeners
Event source mendaftarkan sebuah listener melalui method add
void add
Component, Action dan lainnya.
Beberapa listeners dapat diregistrasi dengan satu event source untuk menerima
pemberitahuan event.
Listener yang telah teregistrasi dapat juga tidak diregistrasikan lagi menggunakan
method remove
void remove
8.3 Class-Class Event
Sebuah event object mempunyai sebuah class event sebagai tipe data acuannya. Akar
dari hirarki class event adalah class EventObject, yang dapat ditemukan pada paket
java.util. Immediate subclass dari class EventObject adalah class AWTEvent. Class
AWTEvent didefinisikan pada paket java.awt. Itu merupakan akar dari semua AWTbased
events. Berikut ini beberapa dari class-class AWT event.
Class Event Deskripsi
ComponentEvent Extends AWTEvent. Dijalankan ketika sebuah komponen
dipindahkan, di-resize, dibuat visible atau hidden.
InputEvent Extends ComponentEvent. Abstrak root class event untuk semua
komponen-level input class-class event.
ActionEvent Extends AWTEvent. Dijalankan ketika sebuah tombol ditekan,
melakukan double-klik daftar item, atau memilih sebuah menu.
ItemEvent Extends AWTEvent. Dijalankan ketika sebuah item dipilih atau dideselect
oleh user, seperti sebuah list atau checkbox.
KeyEvent Extends InputEvent. Dijalankan ketika sebuah key ditekan, dilepas
atau diketikkan.
MouseEvent Extends InputEvent. Dijalankan ketika sebuah tombol mouse
ditekan, dilepas, atau di-klik (tekan dan lepas), atau ketika sebuah
kursor mouse masuk atau keluar dari bagian visible dari komponen.
TextEvent Extends AWTEvent. Dijalankan ketika nilai dari text field atau text
area dirubah.
WindowEvent Extends ComponentEvent. Dijalankan sebuah object Window dibuka,
ditutup, diaktifkan, nonaktifkan, iconified, deiconified, atau ketika
focus ditransfer kedalam atau keluar window.
Tabel 1.2: Class-Class Event
Catatan, bahwa semua subclass-subclass AWTEvent mengikuti konvensi nama berikut
ini:
J.E.N.I.
Pengenalan Pemrograman 2 4
8.4 Event Listeners
Event listeners adalah class yang mengimplementasikan interfaces
Tabel di bawah menunjukkan beberapa listener interfaces yang biasanya digunakan.
Event Listeners Deskripsi
ActionListener Bereaksi atas perubahan mouse atau atau keyboard.
MouseListener Bereaksi atas pergerakan mouse.
MouseMotionListener Interface MouseMotionListener mendukung MouseListener.
Menyediakan method-method yang akan memantau pergerakan
mouse,seperti drag dan pemindahan mouse.
WindowListener Bereaksi atas perubahan window.
Tabel 1.3: Event Listeners
8.4.1 Method ActionListener
Interface ActionListener hanya terdiri dari satu method.
Method ActionListener
public void actionPerformed(ActionEvent e)
Mengendalikan ActionEvent e yang terjadi.
Tabel 1.3.1: Method ActionListener
8.4.2 Method MouseListener
Di bawah ini adalah method-method MouseListener yang seharusnya digunakan dalam
penerapan class.
Method-method MouseListener
public void mouseClicked(MouseEvent e)
Dipanggil pada saat tombol mouse di click (seperti tekan dan lepas).
public void mouseEntered(MouseEvent e)
Dipanggil pada saat kursor mouse memasuki area komponen.
public void mouseExited(MouseEvent e)
Dipanggil pada saat kursor mouse meninggalkan area komponen.
public void mousePressed(MouseEvent e)
Dipanggil pada saat tombol mouse ditekan di atas komponen
public void mouseReleased(MouseEvent e)
Dipanggil pada saat tombol mouse dilepas di atas komponen
Tabel 1.3.2: Method-Method MouseListener
J.E.N.I.
Pengenalan Pemrograman 2 5
8.4.3 Method-Method MouseMotionListener
MouseMotionListener mempunyai dua method untuk diimplementasikan.
Method-method MouseListener
public void mouseDragged(MouseEvent e)
Digunakan untuk memantau pergerakan mouse yang melintasi object pada saat tombol
mouse ditekan. Tindakan ini persis sama dengan tindakan pada saat memindahkan
sebuah window.
public void mouseMoved(MouseEvent e)
Digunakan untuk memantau pergerakan mouse pada saat mouse melintasi area suatu
object. Pada saat ini tidak ada mouse yang ditekan, hanya memindahkan pointer
mouse melalui object.
Tabel 1.3.3: The MouseMotionListener methods
8.4.4 Method-Method WindowListener
Di bawah ini method-method dari interface WindowListener.
Method-method WindowListener
public void windowOpened(WindowEvent e)
Dipanggil pada saat object window dibuka (pertama kali window dibuat tampil).
public void windowClosing(WindowEvent e)
Dipanggil pada saat user mencoba untuk menutup object Window dari menu sistem
object.
public void windowClosed(WindowEvent e)
Dipanggil pada saat object Window ditutup setelah memanggil penempatan (misal,
release dari resource-resource yang digunakan oleh source) pada object.
public void windowActivated(WindowEvent e)
Dilibatkan ketika object Window adalah window yang aktif (window masih dipakai).
public void windowDeactivated(WindowEvent e)
Dilibatkan ketika object Window tidak lagi merupakan window yang aktif.
public void windowIconified(WindowEvent e)
Dipanggil ketika object Window di-minimize.
public void windowDeiconified(WindowEvent e)
Dipanggil ketika object Window kembali setelah di-minimize ke keadaan normal.
Tabel 1.3.4: Method-Method WindowListener
J.E.N.I.
Pengenalan Pemrograman 2 6
8.4.5 Petunjuk untuk Menciptakan Aplikasi Handling GUI Events
Berikut ini langkah-langkah yang Anda butuhkan untuk mengingat ketika ingin membuat
aplikasi GUI dengan event handling.
1. Buatlah sebuah class yang menguraikan dan membuat suatu tampilan dari aplikasi
GUI Anda.
2. Buatlah sebuah class yang menerapkan interface listener yang sesuai. Class ini boleh
mengacu pada class yang sama seperti pada langkah awal.
3. Dalam menerapkan class, gunakan semua method-method dengan interface listener
yang sesuai. Uraikan masing-masing method bagaimana Anda ingin mengendalikan
event-event. Anda dapat memberikan implementasi kosong untuk method yang tidak
ingin Anda gunakan.
4. Daftarkan object listener, instansiatiate dari class listener pada langkah 2, dengan
source component menggunakan method add
8.4.6 Contoh Mouse Events
import java.awt.*;
import java.awt.event.*;
public class MouseEventsDemo extends Frame implements
MouseListener, MouseMotionListener {
TextField tf;
public MouseEventsDemo(String title){
super(title);
tf = new TextField(60);
addMouseListener(this);
}
public void launchFrame() {
/* Menambah komponen pada frame */
add(tf, BorderLayout.SOUTH);
setSize(300,300);
setVisible(true);
}
public void mouseClicked(MouseEvent me) {
String msg = "Mouse clicked.";
tf.setText(msg);
}
public void mouseEntered(MouseEvent me) {
String msg = "Mouse entered component.";
tf.setText(msg);
}
public void mouseExited(MouseEvent me) {
String msg = "Mouse exited component.";
tf.setText(msg);
}
public void mousePressed(MouseEvent me) {
String msg = "Mouse pressed.";
tf.setText(msg);
}
public void mouseReleased(MouseEvent me) {
String msg = "Mouse released.";
tf.setText(msg);
J.E.N.I.
Pengenalan Pemrograman 2 7
}
public void mouseDragged(MouseEvent me) {
String msg = "Mouse dragged at " + me.getX() + "," +
me.getY();
tf.setText(msg);
}
public void mouseMoved(MouseEvent me) {
String msg = "Mouse moved at " + me.getX() + "," +
me.getY();
tf.setText(msg);
}
public static void main(String args[]) {
MouseEventsDemo med = new MouseEventsDemo("Mouse Events
Demo");
med.launchFrame();
}
}
8.4.7 Contoh Menutup Window
import java.awt.*;
import java.awt.event.*;
class CloseFrame extends Frame implements WindowListener {
Label label;
CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(this);
}
void launchFrame() {
setSize(300,300);
setVisible(true);
}
public void windowActivated(WindowEvent e) {
}
public void windowClosed(WindowEvent e) {
}
public void windowClosing(WindowEvent e) {
setVisible(false);
System.exit(0);
}
public void windowDeactivated(WindowEvent e) {
}
public void windowDeiconified(WindowEvent e) {
}
public void windowIconified(WindowEvent e) {
}
public void windowOpened(WindowEvent e) {
}
J.E.N.I.
Pengenalan Pemrograman 2 8
public static void main(String args[]) {
CloseFrame cf = new CloseFrame("Close Window Example");
cf.launchFrame();
}
}
8.5 Class-class Adapter Class
Menerapkan semua method dari interface yang semuanya akan membutuhkan banyak
pekerjaan. Di satu sisi, Anda terkadang lebih sering tertarik menerapkan hanya
beberapa method dari interface saja. Untungnya, Java menyediakan untuk kita classclass
adapter yang menerapkan semua method dari masing-masing listener interface
dengan lebih dari satu method. Implementasi dari method-method semuanya adalah
kosong.
8.5.1 Close Window Example
import java.awt.*;
import java.awt.event.*;
class CloseFrame extends Frame{
Label label;
CFListener w = new CFListener(this);
CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(w);
}
void launchFrame() {
setSize(300,300);
setVisible(true);
}
public static void main(String args[]) {
CloseFrame cf = new CloseFrame("Close Window Example");
cf.launchFrame();
}
}
class CFListener extends WindowAdapter{
CloseFrame ref;
CFListener( CloseFrame ref ){
this.ref = ref;
}
public void windowClosing(WindowEvent e) {
ref.dispose();
System.exit(1);
}
}
J.E.N.I.
Pengenalan Pemrograman 2 9
8.6 Inner Class dan Anonymous Inner Class
Bagian ini memberi Anda tinjauan ulang atas konsep yang sudah Anda pelajari di
pelajaran pemrograman pertama. Inner class dan anonymous inner class sangatlah
bermanfaat untuk GUI event handling.
8.6.1 Inner Class
Inner class, seperti namanya, adalah sebuah class yang dideklarasikan di dalam class
lain. Kegunaan inner classes akan dapat membantu Anda menyederhanakan program,
terutama dalam event handling seperti yang ditunjukkan pada contoh.
8.6.2 Contoh Menutup Window
import java.awt.*;
import java.awt.event.*;
class CloseFrame extends Frame{
Label label;
CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(new CFListener());
}
void launchFrame() {
setSize(300,300);
setVisible(true);
}
class CFListener extends WindowAdapter {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(1);
}
}
public static void main(String args[]) {
CloseFrame cf = new CloseFrame("Close Window
Example");
cf.launchFrame();
}
}
J.E.N.I.
Pengenalan Pemrograman 2 10
8.6.3 Anonymous Inner Class
Anonymous inner class adalah inner class tanpa nama. Kegunaan dari anonymous inner
class akan menyederhanakan kode-kode Anda lebih lanjut. Di bawah ini merupakan
modifikasi dari contoh bagian sebelumnya.
8.6.4 Contoh Menutup Window
import java.awt.*;
import java.awt.event.*;
class CloseFrame extends Frame{
Label label;
CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
dispose();
System.exit(1);
}
});
}
void launchFrame() {
setSize(300,300);
setVisible(true);
}
public static void main(String args[]) {
CloseFrame cf = new CloseFrame("Close Window Example");
cf.launchFrame();
}
}
J.E.N.I.
Pengenalan Pemrograman 2 11
8.7 Latihan
8.7.1 Tic-Tac-Toe
Extend program papan Tic-Tac-Toe yang telah Anda kembangkan sebelumnya dan
tambahkan event handlers ke kode tersebut untuk membuat program berfungsi penuh.
Permainan Tic-Tac-Toe dimainkan dengan dua pemain. Pemain mengambil giliran
mengubah. Setiap giliran, pemain dapat memilih kotak pada papan. Ketika kotak dipilih,
kotak ditandai oleh simbol pemain (O dan X biasanya digunakan sebagai simbol).
Pemain yang sukses menaklukkan 3 kotak membentuk garis horisontal, vertikal, atau
diagonal, memenangkan permainan. Permainan akan berakhir ketika pemain menang
atau ketika semua kotak telah terisi.
Gambar 8.2 : Program Tic-Tac-Toe
Inner Class
Inner Class adalah class yang berada (didefinisikan) di dalam sebuah Class
Contoh: class OuterClass { class InnerClass{ } }
Class diagram dalam UML:
One of the key benefits of an inner class is the "special relationship" an inner class instance shares with an instance of the outer class. That "special relationship" gives code in the inner class access to members of the enclosing (outer) class, as if the inner class were part of the outer class. In fact, hat's exactly what it means: the inner class is a part of the outer class. Not just a "part" but a full-fledged, card-carrying member of the outer class. Yes, an inner class instance has access to all members of the outer class, even those marked private. (Relax, that's the whole point, remember? We want this separate inner class instance to have an intimate relationship with the outer class instance, but we still want to keep everyone else out. And besides, if you wrote the outer class, then you also wrote the inner class! So you're not violating encapsulation; you designed it this way.)
[SCJP Sun® Certified Programmer for Java™ 6 Study Guide (Exam 310-065)]
Ada 4 jenis inner class, yaitu :
1. “Regular” Inner class
2. Method-local inner class
3. Anonymous inner class
4. Static nested classes
Regular Inner Class
Istilah regular inner class (inner class biasa) dimaksudkan untuk inner class selain jenis 2, 3, dan 4
Contoh: class OuterClass { class InnerClass{ } }
Jika dicompile dengan perintah :
%java Outer.java
Maka akan tercipta 2 buah file .class, yaitu :
Outer.class
MyOuter$MyInner.class.
Beberapa hal tentang inner class:
Instance inner class memiliki akses ke semua member dari outer class (termasuk member outer class yang ber access modifier private).
Sebuah inner class tidak dapat memiliki member static
Misalnya: method public static main() tidak bisa dibuat di dalam innre class.
Aturan inner class dalam mereferensi dirinya sendiri atau instance dari outer class adalah sebagai berikut :
Untuk merujuk pada dirinya sendiri (instance dari inner class) dari dalam inner class, dapat digunakan referensi this atau OuterClass.InnerClass.this.
Untuk merujuk pada instance dari outer classnya dari dalam inner class, dapat digunakan referensi OuterClass.this.
Untuk membuat instance dari inner class, kita harus memiliki instance dari outer class terlebih dahulu. Tidak ada pengecualisan untuk aturan ini.
Untuk membuat instance dari inner class, terdapat 2 cara, yaitu :
1. Dari dalam outer class
2. Dari luar outer class
Contoh:
class A {
class B { //class B ada di dalam class A
void sebuahMethodPadaB(){
System.out.println("Hello, saya method di kelas B");
System.out.println("kelas B berada dalam kelas A");
}
}
void sebuahMethodPadaA() {
B b = new B(); //object b diinstance pada sebuah method di class A
System.out.println("Hello, saya method kelas A");
System.out.println("Saya membuat object dari inner class B");
b.sebuahMethodPadaB();
}
}
public class C {
public static void main(String[] args) {
A.B b = new A().new B(); //kelas B dibuat di luar kelas A
b.sebuahMethodPadaB();
A a=new A();
a.sebuahMethodPadaA();
}
}
Method-Local Inner Class Method-local inner class adalah inner class yang dideklarasikan di dalam method.
Mendeklarasikan method-local inner class bukan berarti kita telah membuat instance dari class tersebut. Jadi, sebelum inner class tersebut digunakan, kita harus membuat instancenya dari suatu tempat di dalam method dan setelah definisi inner class tersebut.
Contoh :
class A {
void methodDiA() { // definis method di A
class B { // definisi class B didalam method milik A
int i = 10;
void methodDiB() { // deklarasi method di B
System.out.println(" i = " + i);
} // end method B
} // end class B
B b = new B();
b.methodDiB();
} //end methodDiA
} //end class A
Method-local inner class hanya dapat diinstansiasi dari dalam method yang mendefinisikan method-local inner class tersebut.
Instance method-local inner class memiliki akses ke semua member dari outer class (termasuk member outer class yang ber access modifier private).
Contoh :
class A {
void methodDiA() { // definisi method di A
private int i=10;
class B { // definisi class B didalam method milik A
int i = 10;
void methodDiB() { // deklarasi method di B
System.out.println(" i = " + i); //akses member A
} // end method B
} // end class B
B b = new B();
b.methodDiB();
} //end methodDiA
} //end class A
Instance dari method-local inner class tidak dapat mengakses local variabel (termasuk parameter) dari method dimana method-local inner class tersebut didefinisikan. Kecuali bila variabel tersebut bermodifier final.
Contoh :
class A { //1
void lakukanSesuatu() { //2
int nonFinalVar = 10;
final int finalVar = 11;
class B { //3
void aksesLocalVar() { //4
//ERROR
System.out.println("nonFinalVar = " + nonFinalVar);
//TIDAK ERROR
System.out.println("finalVar = " + finalVar);
} //4
} //3
B b = new B();
b.aksesLocalVar();
} //2
} //1
Method-local inner class yang didefinisikan di dalam static method tidak dapat mengakses non-static member dari outer classnya
Modifier-modifier yang dapat diberikan pada method-local inner class adalah :
1. abstract (tidak dapat digabung dengan final)
2. final (tidak dapat digabung dengan abstract)
Anonymous Inner Class Anonymous inner class adalah suatu inner class yang dideklarasikan tanpa nama kelas.
Anonymous inner class pasti adalah salah satu dari 2 hal berikut :
o Subclass dari suatu class yang telah dideklarasikan
o Class implementasi dari suatu interface
Suatu anonymous inner class tidak dapat secara bersamaan menjadi subclass dari class yang telah dideklarasikan dan juga sebagai kelas implementasi dari suatu interface.
Tujuan utama dari anonymous inner class adalah mengoverride satu atau lebih method dari super classnya atau mengimplement semua method dari suatu interface.
Anonymous inner class tidak dapat mengimplement lebih dari sebuah interface.
Anonymous inner class selalu dibuat sebagai bagian dari suatu statement.
Contoh Anonymous inner class sebagai subclass (melakukan override)
class A {
int i = 10;
void methodDiA() {
System.out.println("i = " + i);
}
}
public class BBB { //1
public static void main(String[] args) { //2
A aa = new A() { //3 <<== lihat ini
void methodDiA() { //4 <<== lihat ini
i++;
System.out.println("i = " + i);
} //4
}; //3
aa.methodDiA();
} //2
} //1
Variabel referensi aa di atas mereferensi ke suatu instance anonymous inner class yang merupakan subclass dari class A. Jadi, variabel referensi aa bukan mereferensi ke instance dari kelas A.
Contoh anonymous inner class sebagai implementasi suatu interface :
interface A {
public void methodDiA();
}
interface B extends A {
public void methodDiB();
}
public class CC {
public static void main(String[] args) {
B b = new B() {
public void methodDiA() {
System.out.println("Ini method di A");
}
public void methodDiB() {
System.out.println("Ini method di B");
}
};
b.methodDiA();
b.methodDiB();
}
}
Anonymous inner class merupakan salah satu bentuk polymorphisme, oleh karena itu, method yang dapat dipanggil dari anonymous inner class adalah method yang dideklarasikan di super class atau interfacenya (meskipun di dalam anonymous inner class dapat dideklarasikan method-method yang tidak ada di super class atau interfacenya).
Contoh :
class A {
int i = 10;
void lakukanSesuatu() {
i--;
System.out.println("i = " + i);
}
}
public class Test {
public static void main(String[] args) {
A a = new A() {
void lakukanSesuatu() {
i++;
System.out.println("i = " + i);
}
//Di bawah ini adalah method yang tidak ada di class A
void newMethod() {
System.out.println("Ini adalah method baru");
}
};
a.lakukanSesuatu(); //Tidak error
a.newMethod(); //ERROR !!!!!!!
}
}
Anonymous inner class dapat diletakkan sebagai argument dari suatu method.
Contoh :
class A {
void lakukanSesuatu() {
System.out.println("Ini isi aslinya");
}
}
class B {
static void demoAnonymousInnerClassSebagaiArgument(A a) {
a.lakukanSesuatu();
}
}
public class BelajarAnonymous3 {
public static void main(String[] args) {
B.demoAnonymousInnerClassSebagaiArgument(new A() {
void lakukanSesuatu() {
System.out.println("Ini method di anonymous inner class");
}
});
}
}
Tugas:
Cobalah contoh-contoh penggunaan inner class!
Di dalam sebuah Mobil terdapat MusicPlayer. MusicPlayer dapat dilihat sebagai sebuah object baru yang merupakan bagian dari mobil dan tidak bisa terpisahkan dari mobil. Implementasikan dalam OOP dengan menerapkan inner class.
Mengapa ada inner class?
Sampai di sini kita sudah mengenal syntax dan semantic bagaimana cara membuat inner class dapat bekerja tetapi belum terjawab kenapa harus ada inner class. Mengapa desainer Java harus repot-repot menambahkan fitur ini?
Secara umum, inner class meng-inherits sebuah class atau meng-implement sebuah interface, dan dan kode-kode pada inner class memanipulasi object-object outer class tempat inner class dibuat. Sehingga kita dapat katakan bahwa sebuah inner class menyediakan seperti sebuah jendela untuk outer class.
Tapi bukankah jika kita ingin mereference ke sebuah interface, bukankah kita bisa cukup melakukannya pada outer class untuk mengimplement sebuah interface? Jawabanya adalah, jika memang itu cukup maka lakukan saja.
At this point you’ve seen a lot of syntax and semantics describing the way inner classes work, but this doesn’t answer the question of why they exist. Why did the Java designers go to so much trouble to add this fundamental language feature?
Typically, the inner class inherits from a class or implements an interface, and the code in the inner class manipulates the outer-class object that it was created within. So you could say that an inner class provides a kind of window into the outer class.
A question that cuts to the heart of inner classes is this: If I just need a reference to an interface, why don’t I just make the outer class implement that interface? The answer is "If that’s all you need, then that’s how you should do it." So what is it that distinguishes an inner class implementing an interface from an outer class implementing the same interface? The answer is that you can’t always have the convenience of interfaces—sometimes you’re working with implementations.
Jadi alasan adanya sebuah inner class adalah:
Masing-masing class dapat secara bebas men
So the most compelling reason for inner classes is:
Each inner class can independently inherit from an implementation. Thus, the inner class is not limited by whether the outer class is already inheriting from an implementation.
Without the ability that inner classes provide to inherit—in effect—from more than one concrete or abstract class, some design and programming problems would be intractable. So one way to look at the inner class is as the rest of the solution of the multiple-inheritance problem. Interfaces solve part of the problem, but inner classes effectively allow "multiple implementation inheritance." That is, inner classes effectively allow you to inherit from more than one non-interface.
Tidak ada komentar:
Posting Komentar