Macam-macam Inner class Pada Java

Photo by Mangcoding

Pada Artikel kali ini Mangcoding akan sharing mengenai Inner Class, Local Class dan Anonymouse Class Pada Java, mudah mudahan Artikel ini dapat bermanfaat untuk Anda yang sedang belajar Java, Yuk kita simak!

Inner class merupakan class yang tidak berada pada top level atau class yang dideklarasikan didalam class lain (Outer class).

Inner class harus menggunakan instance object dari top level class untuk mengakses object method atau field. Karena inner class menggunakan instance dari top level class, maka membernya tidak dapat didekalarasikan dengan static.

class OuterClass {
    ...
  class InnerClass {
      ...
    }
  }

Inner class di Java mempunyai dua macam bentuk, yaitu :

  1. Inner class Local classes
  2. Inner class Anonymouse

Link Mangcoding1. Inner class Local classes

Local class merupakan class yang dideklarasikan dalam block, baik yang berada dalam satu group atau lebih dalam kurung kurawal. Untuk local biasanya sering dideklarasikan dalam method.

a. Mendeklarasikan local class

Pendeklarasian local class di dalam block(expressions, statement dan yang lainnya). Misalnya kita dapat mendeklarasikan local class dalam method atau body iterasi for dan flow kontrol if
Perhatikan gambar dibawah !

package com.wordpress.bmadi.morenestedclass;


public class DemoLocalClass {
    String format = "[^0-9]";


    public static void validatePhoneNumber(String phoneNumber) {
        final int numberLength = 12;


        class PhoneNumber {
            String formattedNumber = null;


            PhoneNumber(String phoneNumber) {
                String currentNumber = phoneNumber.replaceAll(format, "");
                if (currentNumber.length() == numberLength) {
                    formattedNumber = currentNumber;
                } else {
                    formattedNumber = null;
                }
            }


            public String getNumber() {
                return formattedNumber;
            }


            public void printOriginalNumber() {
                System.out.println("Original Number : " + phoneNumber);
            }
        }


        PhoneNumber myNumber = new PhoneNumber(phoneNumber);
        myNumber.printOriginalNumber();


        if (myNumber.getNumber() == null) {
            System.out.println("Number is invalid");
        } else {
            System.out.println("Number : " + myNumber.getNumber());
        }
    }


    public static void main(String[] args) {
        validatePhoneNumber("0858-6722-9783");
    }
}

Program diatas artinya : Mendeklarasikan local class PhoneNumber didalam class method validatePhoneNumber. Kode program diatas akan mengecheck numberPhone berdasarkan format dan length yang telah ditentukan.

b. Mengakses class member

Local class dapat mengakses class member dari class utamanya. Local class juga dapat mengkases local variabel. Akan tetapi local class hanya dapat mengakses local variabel apabila local variabel tersebut dideklarasikan dengan menambahkan keyword final.

Ketika local class ini mengakses local variabel atau parameter, sebenarnya local variabel melakukan caputer local variabel atau parameter tersebut. Perhatikan gambar dibawah !

PhoneNumber(String phoneNumber) {
    int numberLength = 10;
    String currentNumber = phoneNumber.replaceAll(format, "");
    if (currentNumber.length() == numberLength) {
        formatNumber = currentNumber;
    } else {
        formatNumber = null;
    }
}

Kode diatas Merubah nilai dari varibel numberLength yang ditandai dengan final. Potongan kode program diatas memaksakan untuk merubah nilainya yang awalnya 12 menjadi 10.

c. Persamaan inner class dan local class

Local class sama seperti inner class, karena mereka tidak dapat dideklarasikan menggunakan static member. Local class yang berada dalam static method, seperti PhoneNumber diatas yang dideklarasikan dalam static method validatePhoneNumber hanya dapat mengkases static member yang ada pada class dimana ia dideklarasikan.

Link Mangcoding2. Inner class Anonymouse

Class Anonymous adalah class yang tidak memiliki nama. Biasanya dibuat hanya untuk sekali pakai saja. Biasanya class anonymous dibuat untuk mengimplementasikan interface dan class abstrak secara langsung.

Class Anonymous tidak memiliki nama, namun dalam pembuatannya ia akan menggunakan nama dari Interface atau class abstrak yang ia implementasikan.

a. Deklarasi anonymous class

Untuk anonymous class ini berbeda, dimana anonymous class tidak dideklarasikan dalam class lain melainkan dalam sebuah expressi, seperti halnya kita mendeklarasikan class dalam expressi.
Perhatikan gambar dibawah !

package com.wordpress.bmadi.morenestedclass;


public class DemoHelloIndoClass {
    interface HelloIndo {
        public void greet();
        public void greetSomeone(String someone);
    }


    public void sayHelloIndo() {
        class IndoGreeting implements HelloIndo {
            String name = "indonesia";


            public void greet() {
                greetSomeone("Indonesia");
            }


            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hello " + name);
            }
        }
    }
}
HelloIndo IndoGreeting = new IndoGreeting();
HelloIndo jawaGreeting = new HelloIndo() {
    String name = "Jawa";


    public void greet() {
        greetSomeone("Jawa");
    }


    public void greetSomeone(String someone) {
        name = someone;
        System.out.println("Hay " + name);
    }
};


IndoGreeting.greet();
IndoGreeting.greetSomeone("Sandi");
jawaGreeting.greet();
IndoGreeting.greetSomeone("Jumadi");


public static void main(String[] args) {
    DemoHelloIndoClass myApp = new DemoHelloIndoClass();
    myApp.sayHelloIndo();
}
b. Sintaks anonymous class

Seperti yang sudah dijelaskan sebelumnya, bahwa untuk anonymous class ini dideklarasikan dalam sebuah expressi.
Perhatikan kode dibawah !

  • HelloIndo jawaGreeting = new HelloIndo() {
        String name = "Jawa";
    
    
        public void greet() {
            greetSomeone("Jawa");
        }
    
    
        public void greetSomeone(String someone) {
            name = someone;
            System.out.println("Hay " + name);
        }
    };
      Anonymous class ini mengandung beberapa komponen pendukung. Beberapa komponen pendukung tersebut, yaitu :
  • Operator new
  • Nama dari interface atau extends class(anonymous diatas implement interface HelloIndo)
  • Tanda Kurung yang mengandung argument atau yang lainnya. Seperti halnya normal class. Akan tetapi ketika kita menggunakan interface, kita tidak dapat menggunakan constructor. Jadi kita mengosongkan tanda kurung, seperti contoh diatas.
  • Body
c. Access local variabel berdasarkan scope class yang ditempatinya dan access member dari anonymous class
    • Seperti halnya local class, anonymous class juga dapat capture variabel. Class ini memiliki kesamaan dalam hal access local variabel berdasarkan scope dari class yang ditempatinya, seperti :
  • Anonymous class dapat mengakses member dari class yang ditempatinya
  • Anonymous class tidak dapat mengakses local variabel dari scope class yang ditempatinya apabila local variabel tersebut tidak dideklarsikan final atau effectively final
  • Seperti nested class, dalam deklarasi tipe(variabel) dalam anonymous class dapa sama(shadow) dengan pendeklarasian variabel dalam scope class yang ditempatinya. Untuk artikel shadowing silahkan baca disini.
    • Anonymous juga memiliki point-point yang tidak di perbolehkan untuk dilakukan, seperti :
  • Kita tidak dapat mendeklarasikan static initializer atau member interface dalam anonymous class
  • Kita dapat mendeklarasikan static member dalam anonymous class apabila dideklarasikan sebagai constant variabel.
    • Kita juga dapat mendeklarasikan beberapa point dalam anonymous class, seperti :
  • Fields
  • Extra method
  • Instance initializer
  • Local class
d. Contoh dari anonymous class
package com.wordpress.bmadi.morenestedclass;


public class DemoAnonymousClass {
    public static void main(String[] args) {
        Thread anonymous = new Thread() {
            @Override
            public void run() {
                System.out.println("This is example anonymous class in Java");
            }
        };


        anonymous.start();
    }
}

Kode program diatas artinya : Mendeklarasikan anonymous class yang implement interface Thread dan memanggil method object Thread menggunakan method start.