Bersarang dengan antarmuka Java

Jika Anda telah membaca tutorial Java 101 saya yang memperkenalkan kelas statis dan kelas dalam, Anda harus terbiasa dengan dasar-dasar bekerja dengan kelas bersarang dalam kode Java. Dalam tip Java ini, Anda akan mempelajari tiga cara umum untuk menggunakan teknik bersarang dengan antarmuka Java. Saya juga akan secara singkat mendemonstrasikan antarmuka bersarang dengan metode statis, juga dikenal sebagai antarmuka metode statis.

Lebih lanjut tentang antarmuka Java

Untuk pengenalan antarmuka Java, termasuk perbedaan antara kelas dan antarmuka, lihat tutorial Java 101 saya Bekerja dengan antarmuka di Java.

Antarmuka bersarang di kelas

Java memungkinkan Anda mendeklarasikan antarmuka di dalam kelas. Setelah dideklarasikan, sebuah antarmuka secara otomatis menjadi anggota statis kelas. Tidak perlu mendeklarasikan antarmuka dengan statickata kunci. Perhatikan contoh berikut:

 class EnclosingClass { interface EnclosedInterface1 { } static interface EnclosedInterface2 { } } 

EnclosedInterface1dan EnclosedInterface2merupakan antarmuka anggota statis . Tidak ada yang setara dengan kelas lokal karena antarmuka tidak dapat dideklarasikan dalam blok. Namun, antarmuka dapat digunakan dalam konteks kelas anonim.

Antarmuka bersarang biasanya tidak diakses dari luar kelas yang melingkupinya. Jika tidak, Anda dapat mendeklarasikannya sebagai antarmuka tingkat atas . Sebaliknya, mereka diakses dari dalam kelas yang melingkupinya, seperti yang ditunjukkan di sini:

 class EnclosingClass { interface EnclosedInterface1 { } static interface EnclosedInterface2 { } static class EnclosedClass1 implements EnclosedInterface1, EnclosedInterface2 { } class EnclosedClass2 implements EnclosedInterface1, EnclosedInterface2 { } void m() { class EnclosedClass3 implements EnclosedInterface1, EnclosedInterface2 { } new EnclosedInterface1() { }; } } 

Perhatikan bahwa kelas anggota statis, kelas anggota EnclosedClass1non-statis EnclosedClass2, dan kelas lokal EnclosedClass3mengimplementasikan kedua antarmuka bertingkat. Namun, hanya satu antarmuka yang dapat diimplementasikan dalam konteks kelas anonim. (Lihat kelas statis dan kelas dalam di Java untuk informasi lebih lanjut tentang kelas anonim.)

Kelas dengan antarmuka bersarang di java.net

Pustaka kelas standar Java menyertakan kelas dengan antarmuka bertingkat. Misalnya, InetAddress(dalam java.netpaket), yang mewakili alamat Protokol Internet, mendeklarasikan Addressesantarmuka privat yang diimplementasikan oleh kelas anggota privat CachedAddressesdan NameServiceAddressesstatis. Ini juga mendeklarasikan NameServiceantarmuka pribadi yang diimplementasikan oleh kelas anggota privat PlatformNameServicedan HostsFileNameServicestatis.

Antarmuka bersarang di antarmuka

Java juga memungkinkan Anda mendeklarasikan antarmuka di dalam antarmuka. Dalam kasus ini, antarmuka bersarang adalah anggota statis dari antarmuka yang melingkupinya, dan sekali lagi statickata kunci tersebut berlebihan. Selain itu, antarmuka bersarang secara implisit bersifat publik. Berikut contohnya:

 interface EnclosingInterface { interface EnclosedInterface1 // implicitly static and public { } static interface EnclosedInterface2 // explicitly static and implicitly public { } } 

Anda mengakses antarmuka tertutup dengan mengawali namanya dengan nama antarmuka terlampir dan operator akses anggota. Misalnya, tentukan EnclosingInterface.EnclosedInterface1untuk mengakses EnclosedInterface1.

Antarmuka bersarang di Java Collections Framework

Java Collections Framework memberikan wawasan tentang kegunaan menumpuk satu antarmuka di antarmuka lain. Pertimbangkan java.util.Mapantarmuka, yang mendeskripsikan peta (kumpulan pasangan kunci-nilai). The Mapantarmuka abstrak apa artinya menjadi peta. Kelas-kelas seperti HashMapdan java.util.TreeMapimplementasi Map, menggambarkan berbagai jenis implementasi peta.

Mapmenyatakan Entrysebagai salah satu anggotanya. Entryadalah antarmuka bertingkat yang mendeskripsikan pasangan kunci-nilai. The Entryantarmuka dinyatakan dalam Mapkarena hubungan erat antara dua antarmuka - setiap entri harus milik peta. Entrydiimplementasikan oleh java.util.AbstractMapkelas SimpleEntrydan SimpleImmutableEntrykelas anggota statis. Biasanya Anda akan mengabaikan kelas anggota statis ini dan Map.Entrysebagai gantinya berinteraksi .

Kelas bersarang di antarmuka

Salah satu fitur bahasa asing Java adalah kemampuan untuk membuat kelas bersarang di dalam antarmuka. Seperti halnya antarmuka bersarang, kelas bersarang secara implisit bersifat publik dan statis. Berikut contohnya:

 interface EnclosingInterface { class EnclosedClass { } } 

Terlepas dari keanehannya, kemampuan menumpuk kelas di dalam antarmuka dapat berguna, terutama bila ada hubungan erat antara antarmuka penutup dan kelas tertutup. Menangkap hubungan ini meningkatkan keterbacaan kode sumber. Jika kelas dan antarmuka memiliki nama yang sama, bersarang juga dapat membantu Anda menghindari konflik nama di antara keduanya.

Contoh: Antarmuka yang dapat dialamatkan menyertakan kelas Alamat

Misalkan Anda ingin membuat model entitas yang dapat dialamatkan seperti surat, kartu pos, dan parsel. Setiap entitas akan dijelaskan oleh kelasnya sendiri, tetapi mereka semua memiliki kesamaan yang dapat dialamatkan ke beberapa tujuan. Setiap kelas dapat dirancang dengan bidang alamat duplikat, atau Anda dapat mengabstraksikan detail ini menjadi superclass umum. Sebagai alternatif, Anda dapat memanfaatkan Addressableantarmuka Listing 1 .

Daftar 1. Addressable.java

 public interface Addressable { public class Address { private String boxNumber; private String street; private String city; public Address(String boxNumber, String street, String city) { this.boxNumber = boxNumber; this.street = street; this.city = city; } public String getBoxNumber() { return boxNumber; } public String getStreet() { return street; } public String getCity() { return city; } public String toString() { return boxNumber + " - " + street + " - " + city; } } public Address getAddress(); } 

The Addressableantarmuka menggambarkan suatu entitas dialamatkan sebagai mengandung alamat. Alamat ini dijelaskan oleh Addresskelas bertingkat . The getAddress()Metode ini dilaksanakan oleh mengimplementasikan kelas apapun Addressable.

Kode 2 menyajikan kode sumber ke Letterkelas yang mengimplementasikan Addressable.

Daftar 2. Letter.java

 public class Letter implements Addressable { private Addressable.Address address; public Letter(String boxNumber, String street, String city) { address = new Addressable.Address(boxNumber, street, city); } public Address getAddress() { return address; } } 

Lettermenyimpan satu addressbidang tipe Addressable.Address. Kelas bersarang ini dibuat oleh Letterkonstruktor. getAddress()Metode yang diimplementasikan mengembalikan objek ini.

Sekarang pertimbangkan apa yang terjadi ketika kita menambahkan Postcarddan Parcelkelas ke Addressablesaplikasi. Listing 3 hadiah kode sumber untuk sebuah Addressablesaplikasi, yang menunjukkan Postcard, Parcel, dan Letterjenis.

Daftar 3. Addressables.java

 public class Addressables { public static void main(String[] args) { Addressable[] addressables = { new Letter("100", "Main Street", "Town A"), new Postcard("200", "Waterfront Drive", "Town B"), new Parcel("300", "10th Ave", "Town C") }; for (int i = 0; i < addressables.length; i++) System.out.println(addressables[i].getAddress()); } }

The main() method first creates an array of Addressable objects. It then iterates over these objects, invoking getAddress() on each object. The returned Addressable.Address object's toString() method is invoked by System.out.println() to return a string representation of the object, and this representation is subsequently output.

Compile Listings 2 and 3 along with Postcard.java and Parcel.java as follows:

 javac *.java 

Run the application as follows:

 java Addressables 

You should observe the following output:

 100 - Main Street - Town A 200 - Waterfront Drive - Town B 300 - 10th Ave - Town C 

Nested interfaces with static methods (static method interfaces)

Many developers believe that nesting a class in an interface violates object-oriented programming and the purpose for an interface. However, it's good to know about this capability because you might encounter it when maintaining someone else's code. Furthermore, now that interfaces have evolved to include default and static methods, you might encounter additional reasons to nest a class in an interface. As an example, here is a local class nested within a static method interface:

 interface I { static void m() { class C { } } } 

Conclusion

I've presented three common ways to use nesting techniques with Java classes and interfaces, and also demonstrated a controversial technique of nesting interfaces with static methods. See the complete Java 101 tutorial to learn more about nesting with static classes and inner classes in Java.

Artikel ini, "Bersarang dengan antarmuka Java" pada awalnya diterbitkan oleh JavaWorld.