Kelas Bersarang di Java

1. Perkenalan

Tutorial ini adalah pengantar cepat dan langsung ke kelas bersarang dalam bahasa Java.

Sederhananya, Java memungkinkan kita untuk mendefinisikan kelas di dalam kelas lain. Kelas bersarang memungkinkan kita untuk secara logis mengelompokkan kelas yang hanya digunakan di satu tempat, menulis kode yang lebih mudah dibaca dan dipelihara, serta meningkatkan enkapsulasi.

Sebelum kita mulai, mari kita lihat beberapa tipe kelas bersarang yang tersedia dalam bahasa ini:

  • Kelas bertingkat statis
  • Kelas bersarang non-statis
  • Kelas lokal
  • Kelas anonim

Di bagian selanjutnya, kita akan membahas masing-masing secara rinci.

2. Kelas Bersarang Statis

Berikut beberapa hal yang perlu diingat tentang kelas bertingkat statis:

  • Seperti dengan anggota statis, ini milik kelas penutup mereka, dan bukan turunan kelas
  • Mereka dapat memiliki semua jenis pengubah akses dalam deklarasi mereka
  • Mereka hanya memiliki akses ke anggota statis di kelas penutup
  • Mereka dapat mendefinisikan anggota statis dan non-statis

Mari kita lihat bagaimana kita bisa mendeklarasikan kelas bertingkat statis:

public class Enclosing { private static int x = 1; public static class StaticNested { private void run() { // method implementation } } @Test public void test() { Enclosing.StaticNested nested = new Enclosing.StaticNested(); nested.run(); } }

3. Kelas Bersarang Non-Statis

Selanjutnya, berikut adalah beberapa poin cepat yang perlu diingat tentang kelas bertingkat non-statis:

  • Mereka juga disebut kelas dalam
  • Mereka dapat memiliki semua jenis pengubah akses dalam deklarasi mereka
  • Sama seperti variabel dan metode instance, kelas dalam dikaitkan dengan instance dari kelas penutup
  • Mereka memiliki akses ke semua anggota kelas yang melingkupinya, terlepas dari apakah kelas tersebut statis atau non-statis
  • Mereka hanya dapat mendefinisikan anggota non-statis

Inilah cara kita mendeklarasikan kelas dalam:

public class Outer { public class Inner { // ... } }

Jika kita mendeklarasikan kelas bersarang dengan pengubah statis , maka itu adalah kelas anggota statis. Jika tidak, itu adalah kelas batin. Meskipun secara sintaksis perbedaannya hanyalah satu kata kunci (yaitu, statis ), secara semantik terdapat perbedaan besar antara jenis kelas bersarang ini. Instance kelas dalam terikat ke kelas yang melingkupi dan karena itu mereka memiliki akses ke anggotanya. Kita harus menyadari masalah ini saat memilih apakah akan membuat kelas bersarang menjadi kelas dalam.

Untuk membuat instance kelas dalam, pertama-tama kita harus membuat instance kelas yang melingkupinya.

Mari kita lihat bagaimana kita bisa melakukannya:

Outer outer = new Outer(); Outer.Inner inner = outer.new Inner();

Di subbagian berikutnya, kami akan menunjukkan beberapa tipe khusus kelas dalam.

3.1. Kelas Lokal

Kelas lokal adalah tipe khusus dari kelas dalam - di mana kelas didefinisikan di dalam blok metode atau cakupan.

Mari kita lihat beberapa hal yang perlu diingat tentang jenis kelas ini:

  • Mereka tidak dapat memiliki pengubah akses dalam deklarasi mereka
  • Mereka memiliki akses ke anggota statis dan non-statis dalam konteks yang melingkupinya
  • Mereka hanya dapat menentukan anggota instance

Berikut contoh singkatnya:

public class NewEnclosing { void run() { class Local { void run() { // method implementation } } Local local = new Local(); local.run(); } @Test public void test() { NewEnclosing newEnclosing = new NewEnclosing(); newEnclosing.run(); } }

3.2. Kelas Anonim

Kelas anonim dapat digunakan untuk menentukan implementasi antarmuka atau kelas abstrak tanpa harus membuat implementasi yang dapat digunakan kembali.

Mari daftar beberapa hal yang perlu diingat tentang kelas anonim:

  • Mereka tidak dapat memiliki pengubah akses dalam deklarasi mereka
  • Mereka memiliki akses ke anggota statis dan non-statis dalam konteks yang melingkupinya
  • Mereka hanya dapat menentukan anggota instance
  • Mereka adalah satu-satunya tipe kelas bersarang yang tidak dapat mendefinisikan konstruktor atau memperluas / mengimplementasikan kelas atau antarmuka lain

Untuk mendefinisikan kelas anonim, pertama mari kita tentukan kelas abstrak sederhana:

abstract class SimpleAbstractClass { abstract void run(); }

Sekarang mari kita lihat bagaimana kita dapat mendefinisikan kelas anonim:

public class AnonymousInnerUnitTest { @Test public void whenRunAnonymousClass_thenCorrect() { SimpleAbstractClass simpleAbstractClass = new SimpleAbstractClass() { void run() { // method implementation } }; simpleAbstractClass.run(); } }

Untuk lebih jelasnya, kami mungkin menemukan tutorial kami tentang Kelas Anonim di Java.

4. Membayangi

Deklarasi anggota kelas dalam membayangi kelas terlampir jika mereka memiliki nama yang sama.

Dalam kasus ini, kata kunci ini merujuk pada instance kelas bersarang dan anggota kelas luar dapat dirujuk menggunakan nama kelas luar.

Mari kita lihat contoh singkatnya:

public class NewOuter { int a = 1; static int b = 2; public class InnerClass { int a = 3; static final int b = 4; public void run() { System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("NewOuterTest.this.a = " + NewOuter.this.a); System.out.println("NewOuterTest.b = " + NewOuter.b); System.out.println("NewOuterTest.this.b = " + NewOuter.this.b); } } @Test public void test() { NewOuter outer = new NewOuter(); NewOuter.InnerClass inner = outer.new InnerClass(); inner.run(); } }

5. Serialisasi

Untuk menghindari java.io.NotSerializableException saat mencoba membuat serial kelas bersarang, kita harus:

  • Deklarasikan kelas bertingkat sebagai statis
  • Jadikan kelas bersarang dan kelas yang melingkupinya dapat diimplementasikan dengan Serializable

6. Kesimpulan

Dalam artikel ini, kita telah melihat apa itu kelas bersarang dan jenisnya yang berbeda. Kami juga melihat perbedaan visibilitas bidang dan pengubah akses di berbagai jenis tersebut.

Seperti biasa, implementasi lengkap dari tutorial ini dapat ditemukan di GitHub.