This is default featured slide 1 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

Rabu, 14 Maret 2012

Anonymous Inner Class

Anonymous Inner Class
·         Anonymous inner class adalah suatu inner class yang dideklarasikan tanpa nama kelas. [2]
·         Anonymous inner class pasti adalah salah satu dari 2 hal berikut :
1.      Subclass dari suatu class yang telah dideklarasikan
2.      Kelas 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. [2]
·         Tujuan utama dari anonymous inner class adalah mengoverride satu atau lebih method dari super classnya atau mengimplement semua method dari suatu interface. [2]

·         Anonymous inner class tidak dapat mengimplement lebih dari sebuah interface. [2]
·         Anonymous inner class selalu dibuat sebagai bagian dari suatu statement. [2]
·         Contoh Anonymous inner class sebagai subclass : [1]
Program 11

class A {
    int i = 10;
    void lakukanSesuatu() {
        i--;
        System.out.println("i = " + i);
    }
}

public class BelajarAnonymous1 {    //1
    public static void main(String[] args) {    //2
        A a = new A() {   //3
            void lakukanSesuatu() { //4
                i++;
                System.out.println("i = " + i);
            }   //4
        };  //3
       
        a.lakukanSesuatu();
    }   //2
}   //1

Note: variabel referensi a di atas mereferensi ke suatu instance anonymous inner class yang merupakan subclass dari class A. Jadi, variabel referensi a bukan mereferensi ke instance dari kelas A.

  • Contoh anonymous inner class sebagai implementasi suatu interface : [1]
Program 12

interface A {
    public void doA();
}

interface B extends A {
    public void doB();
}

public class BelajarAnonymous2 {
    public static void main(String[] args) {
        B b = new B() {
            public void doA() {
                System.out.println("Ini method doA()");
            }
           
            public void doB() {
                System.out.println("Ini method doB()");
            }
        };
       
        b.doA();
        b.doB();
    }
}


  • Anonymous inner class adalah salah satu bentuk dari 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 : [1]
Program 13

class A {
    int i = 10;
    void lakukanSesuatu() {
        i--;
        System.out.println("i = " + i);
    }
}

public class BelajarAnonymous1 {
    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("Hallo, nama saya Anton");
            }
        };
       
        a.lakukanSesuatu(); //Tidak error
        a.newMethod(); //ERROR !!!!!!!
    }
}


  • Anonymous inner class dapat diletakkan sebagai argument dari suatu method. Contoh : [1]
Program 14

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");
            }
        });
    }
}


Inner Class

Inner Class adalah suatu Class yang didefinisikan di dalam Class lain. Dengan kata lain, Inner Class adalah anggota (member) dari Class lain, sama halnya seperti variable dan method. Hal ini mengakibatkan instance dari Inner Class dapat mengakses /berbagi dengan instance dari outer Class-nya. Instance dari Inner Class dapat mengakses semua member dari outer Class-nya, bahkan yang private.
Ok, Sekarang saya akan mencoba menjelaskan Inner Class yang regular (Inner Class yang biasa). Regular di sini maksudnya adalah bukan static, method-local, atau anonymous. Coba perhatikan Class berikut:
class MyOuter{
private int x = 7;
class MyInner {
public void seeOuter(){
System.out.println(“Outer x is ” + x);
}
}
}
Walaupun variabel x dari class MyOuter adalah private, MyInner tetap bisa mengaksesnya. Ini salah satu kelebihan dari Inner Class.
Ok, pertanyaan pun akan muncul di benak Anda. Bagaimana cara mengaksesMyInner.seeOuter() ? Yang jelas, kita harus menciptakan instance dari MyInner dahulu. Lalu bagaimana melakukan instantiasi MyInner?
Untuk menginstantiasi sebuah Inner Class, kita harus memiliki instance dari outer Class untuk mengikat Inner Class tersebut. Caranya sebagai berikut:
1. Instantiasi Inner Class dari dalam code outer Class
Perhatikan code berikut:
class MyOuter{
private int x = 7;
public void makeInner(){
MyInner in = new MyInner();
In.seeOuter();
}
class MyInner{
public void seeOuter(){
System.out.println(“Outer x is ” + x);
}
}
}
Code di atas memperlihatkan salah satu cara melakukan instantiasi Inner Class MyInner dari dalam code MyOuter. Ini bisa berjalan jika instance dari MyOuter sudah tercipta, lalu instance tersebut menginvoke method-nya, yaitu makeInner().
Lalu, bagaimana kalo ingin menciptakan MyInner dari luar code MyOuter?
2. Membuat Inner Class obyek dari luar code instance outer Class-nya
Ok, Coba perhatikan kalimat berikut :
“Untuk menginstantiasi sebuah Inner Class, kita harus memiliki instance dari outer Class untuk mengikat Inner Class tersebut”
Bila diperhatikan lebih seksama, Anda pasti menemukan sebuah implikasi. Implikasinya adalah bahwa kita tidak akan bisa melakukan instantiasi Inner Class di dalam static method dari outer class-nya. Nah, ini dia implikasinya. Akan tetapi, Apakah bisa menciptakan Inner Class dari luar outer class-nya atau di dalam static method outer class-nya? Jawabnya adalah Bisa. Dengan sedikit trik tentunya. Perhatikan code berikut:
class AnotherClass{
public static void main(String[] args){
MyOuter mo = new MyOuter();
MyOuter.MyInner inner = mo.new MyInner();
Inner.seeOuter();
}
}
AnotherClass adalah class lain yang tentunya berada dalam satu package dengan OuterClass (karena access modifier OuterClass adalah default). Jika OuterClass public, maka tentu AnotherClass bisa di dalam package mana saja. Atau bisa disingkat sebagai berikut:
class AnotherClass{
public static void main(String[] args){
MyOuter.MyInner inner = new MyOuter().new MyInner();
Inner.seeOuter();
}
}
Cukup sederhana kan?

Class Adapter

Konteks:
- Diinginkan untuk menggunakan suatu class dengan antarmuka (method-method public) tertentu tanpa mengubah definisi class tersebut. Class ini kita sebut adaptee.
- Konteks permasalahan dimana kita ingin menggunakan class ini membutuhkan antarmuka yang berbeda dari yang dimiliki class adaptee. Antarmuka yang diperlukan untuk ini kita sebut target.
- Antarmuka untuk target dan antarmuka yang dimiliki adaptee secara konsep berkaitan.

Solusi:
- Antarmuka yang dibutuhkan client (target) didefinisikan sebagai interface dengan method-method yang dibutuhkan untuk menyelesaikan tugas.
- Definisikan sebuah class adapter yang mengimplementasikan interface target ini.
- Class adapter memiliki referensi terhadap objek adaptee (relasi compose a.k.a HAS_A). Class adapter menerjemahkan method yang dideklarasikan pada interface target ke dalam method dari adaptee.
- Client membungkus objek adaptee ke dalam objek adapter. Client melaksanakan tugasnya dengan memanggil method adapter, dan adapter menerjemahkannya dengan memanggil method adaptee yang bersesuaian.

Image

Contoh:
Java Library:
Dalam Java, System.in membaca rentetan byte yang masuk ke dalam komputer (input stream standar). Rentetan byte ini terkandung dalam field System.in yang memiliki tipe data InputStream. Input dari keyboard merupakan karakter yang dikodekan dalam byte-byte yang dikirim oleh keyboard. Dalam program console, kita ingin membaca input dari keyboard sebagai karakter, bukan byte. Untuk itu, kita memakai objek InputStreamReader untuk menerjemahkan byte yang dibaca dari keyboard menjadi karakter.

CODE: SELECT ALL
InputStreamReader reader = new InputStreamReader(System.in);


objek InputStreamReader bertindak sebagai adapter yang menerjemahkan antarmuka (operasi) pengambilan rentetan byte input dari keyboard menjadi antarmuka (operasi) yang menghasilkan rentetan karakter. System.in bertindak sebagai objek adaptee yang melakukan "the real deal".

NB: InputStreamReader membaca karakter satu-persatu, tapi tidak bisa membaca string secara sekaligus, sehingga InputStreamReader kurang efisien -- method dari objek InputStreamReader dipanggil untuk tiap karakter yang dimasukkan lewat keyboard. Untuk meningkatkan efisiensi, pembacaan string input dari keyboard dilakukan secara buffered -- karakter yang diketikkan lewat keyboard dimasukkan ke dalam buffer terlebih dahulu untuk kemudian dibaca sekaligus dalam satu pemanggilan method.

CODE: SELECT ALL
new BufferedReader consoleInput = new BufferedReader(reader);

// atau seperti ini

new BufferedReader consoleInput = new BufferedReader(new InputStreamReader(System.in));

Pendekorasian objek InputStreamReader supaya mendukung buffered input dengan menggunakan objek BufferedRead di atas menggunakan design pattern Decorator dan tidak berkaitan dengan Adapter, atau dengan kata lain pembacaan input keyboard secara buffered dilakukan menggunakan pattern Adapter kemudian Decorator. 

Contoh Event Handling di Java

Event Handling merupakan konsep penanganan suatu action yang terjadi. Jadi suatu program akan berjalan saat sesuatu terjadi, misalnya saat tombol diklik, saat combo box dipilih dan sebagainya. Java memiliki beberapa jenis Event Handling, salah satunya adalah class ActionListener yang menangani aksi terhadap tombol. Berikut ini contoh programnya:
Tampilan:
contoh-program-event-handling-java

Program:
01import java.awt.*;
02import java.awt.event.*;
03import javax.swing.*;
04 
05public class ClickMe extends JFrame implements ActionListener {
06    private JButton tombol;
07 
08    public ClickMe() {
09        super ("Event Handling");  
10 
11        Container container = getContentPane();
12        container.setLayout(new FlowLayout());     
13 
14        tombol = new JButton ("Click Me!");
15        tombol.addActionListener(this);
16        container.add(tombol);     
17 
18        setSize (200,100);
19        setVisible (true);
20    }
21 
22    public static void main (String arg[]) {
23        ClickMe test = new ClickMe();
24        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
25    }
26 
27    public void actionPerformed (ActionEvent e) {
28        if (e.getSource() == tombol) {
29            JOptionPane.showMessageDialog(null"You click me, guys !!!");
30        }
31    }
32}