Bersarang dengan antara muka Java

Sekiranya anda telah membaca tutorial Java 101 saya yang memperkenalkan kelas statik dan kelas dalam, anda semestinya biasa dengan asas-asas bekerja dengan kelas bersarang dalam kod Java. Dalam petua Java ini, anda akan mempelajari tiga cara umum untuk menggunakan teknik bersarang dengan antara muka Java. Saya juga akan menunjukkan secara ringkas antara muka bersarang dengan kaedah statik, juga dikenali sebagai antara muka kaedah statik.

Lebih banyak mengenai antara muka Java

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

Antaramuka bersarang di kelas

Java membolehkan anda menyatakan antara muka di dalam kelas. Setelah diisytiharkan, antara muka secara automatik menjadi ahli kelas yang statik. Tidak perlu menyatakan antara muka dengan statickata kunci. Pertimbangkan contoh berikut:

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

EnclosedInterface1dan EnclosedInterface2adalah antara muka ahli statik . Tidak ada yang setara dengan kelas tempatan kerana antara muka tidak dapat dinyatakan dalam blok. Walau bagaimanapun, antara muka boleh digunakan dalam konteks kelas tanpa nama.

Antaramuka bersarang biasanya tidak dapat diakses dari luar kelas penutupnya. Jika tidak, anda boleh menyatakannya sebagai antara muka tingkat atas . Sebaliknya, mereka diakses dari dalam kelas penutup mereka, 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 bahawa kelas ahli statik EnclosedClass1, kelas anggota tidak statik EnclosedClass2, dan kelas tempatan EnclosedClass3melaksanakan kedua-dua antara muka bersarang. Walau bagaimanapun, hanya satu antara muka yang dapat dilaksanakan dalam konteks kelas tanpa nama. (Lihat kelas Statik dan kelas dalam di Java untuk lebih lanjut mengenai kelas tanpa nama.)

Kelas dengan antara muka bersarang di java.net

Perpustakaan kelas standard Java merangkumi kelas dengan antara muka bersarang. Sebagai contoh, InetAddress(dalam java.netpakej), yang mewakili alamat Protokol Internet, menyatakan Addressesantara muka peribadi yang dilaksanakan oleh kelas anggota persendirian CachedAddressesdan NameServiceAddressesstatik. Ia juga menyatakan NameServiceantara muka peribadi yang dilaksanakan oleh kelas anggota persendirian PlatformNameServicedan HostsFileNameServicestatik.

Antaramuka bersarang dalam antara muka

Java juga membolehkan anda menyatakan antara muka antara muka. Dalam kes ini, antara muka bersarang adalah anggota statik antara muka yang melampirkan, dan sekali lagi statickata kunci itu berlebihan. Juga, antara muka bersarang secara terbuka secara tersirat. Inilah contohnya:

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

Anda mengakses antara muka yang dilampirkan dengan awalan namanya dengan nama antara muka dan operator akses anggota yang melampirkan. Sebagai contoh, tentukan EnclosingInterface.EnclosedInterface1untuk mengakses EnclosedInterface1.

Antaramuka bersarang dalam Kerangka Koleksi Java

Java Collections Framework memberikan pandangan mengenai kegunaan bersarang antara muka antara muka yang lain. Pertimbangkan java.util.Mapantara muka, yang menggambarkan peta (koleksi pasangan nilai-kunci). The Mapmuka abstrak apa ertinya menjadi peta. Kelas seperti HashMapdan java.util.TreeMapmelaksanakan Map, menerangkan pelbagai jenis pelaksanaan peta.

Mapmengisytiharkan Entrysebagai salah satu anggotanya. Entryadalah antara muka bersarang yang menggambarkan pasangan nilai-kunci. The Entrymuka diistiharkan Mapkerana hubungan erat antara dua antara muka - setiap penyertaan mestilah berada dalam peta. Entrydilaksanakan oleh java.util.AbstractMapkelas anggota kelas SimpleEntrydan SimpleImmutableEntrystatik. Anda biasanya akan mengabaikan kelas ahli statik ini dan berinteraksi dengannya Map.Entry.

Kelas bersarang di antara muka

Salah satu ciri bahasa orang asing adalah kemampuan untuk bersarang kelas di antara muka. Seperti antara muka bersarang, kelas bersarang secara tersirat umum dan statik. Inilah contohnya:

 interface EnclosingInterface { class EnclosedClass { } } 

Walaupun keanehan, dapat menyusun kelas di antara muka dapat berguna, terutama ketika ada hubungan erat antara antara muka dengan kelas tertutup. Menangkap hubungan ini meningkatkan kebolehbacaan kod sumber. Sekiranya kelas dan antara muka mempunyai nama yang sama, bersarang juga dapat membantu anda mengelakkan konflik nama antara keduanya.

Contoh: Antara muka beralamat merangkumi kelas Alamat

Katakan anda mahu memodelkan entiti yang dapat dialamatkan seperti surat, kad pos dan bungkusan. Setiap entiti akan digambarkan oleh kelasnya sendiri, tetapi mereka semua mempunyai kesamaan untuk dihubungi ke beberapa destinasi. Setiap kelas boleh dirancang dengan medan alamat pendua, atau anda mungkin menyusun butiran ini menjadi superclass biasa. Sebagai alternatif, anda boleh memanfaatkan Addressableantara muka Penyenaraian 1 .

Penyenaraian 1. Alamatable.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(); } 

Antara Addressablemuka menerangkan entiti yang boleh dialamatkan sebagai mengandungi alamat. Alamat ini dijelaskan oleh Addresskelas bersarang . The getAddress()kaedah dilaksanakan oleh alat-apa kelas Addressable.

Penyenaraian 2 menunjukkan kod sumber kepada Letterkelas yang melaksanakan Addressable.

Penyenaraian 2. Surat.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 addressbidang jenis tunggal Addressable.Address. Kelas bersarang ini disusun oleh Letterpembina. getAddress()Kaedah yang dilaksanakan mengembalikan objek ini.

Sekarang pertimbangkan apa yang berlaku semasa kita menambah Postcarddan Parcelkelas pada Addressablesaplikasi. Penyenaraian 3 hadiah kod sumber kepada Addressablespermohonan, yang menunjukkan Postcard, Parceldan Letterjenis.

Penyenaraian 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.

Kisah ini, "Nesting with Java interfaces" awalnya diterbitkan oleh JavaWorld.