Gniježđenje s Java sučeljima

Ako ste pročitali moj tutorial Java 101 koji uvodi statičke klase i interne klase, trebali biste biti upoznati s osnovama rada s ugniježđenim klasama u Java kodu. U ovom Java savjetu naučit ćete tri uobičajena načina korištenja tehnika gniježđenja s Java sučeljima. Također ću ukratko prikazati gniježđenje sučelja sa statičkim metodama, također poznatim kao sučelja statičkih metoda.

Više o Java sučeljima

Za uvod u Java sučelja, uključujući razliku između klasa i sučelja, pogledajte moj vodič za Java 101 Rad sa sučeljima u Javi.

Gniježđenje sučelja u nastavi

Java vam omogućuje deklariranje sučelja unutar klasa. Jednom kad je deklarirano, sučelje je automatski statični član klase. Nije potrebno deklarirati sučelje s staticključnom riječi. Razmotrimo sljedeći primjer:

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

EnclosedInterface1a EnclosedInterface2su statička sučelja članova . Ne postoji ekvivalent lokalnim klasama jer se sučelja ne mogu deklarirati u blokovima. Međutim, sučelja se mogu koristiti u anonimnim kontekstima klasa.

Ugnježđenim sučeljima obično se ne pristupa izvan njihovih zatvorenih klasa. Inače biste ih mogli proglasiti sučeljima najviše razine . Umjesto toga, pristupa im se iz zatvorenih klasa, kao što je ovdje pokazano:

 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() { }; } } 

Imajte na umu da klasa statičkih članova EnclosedClass1, ne-statička klasa članova EnclosedClass2i lokalna klasa EnclosedClass3implementiraju oba ugniježđena sučelja. Međutim, samo jedno sučelje može se implementirati u anonimni kontekst klase. (Pogledajte Statičke klase i interne klase u Javi za više informacija o anonimnim klasama.)

Predavanja s ugniježđenim sučeljima u java.net

Javina standardna knjižnica klasa uključuje klase s ugniježđenim sučeljima. Na primjer, InetAddress(u java.netpaketu), koji predstavlja adresu internetskog protokola, deklarira privatno Addressessučelje koje implementiraju privatne CachedAddressesi NameServiceAddressesstatičke klase članova. Također deklarira privatno NameServicesučelje koje implementiraju privatne PlatformNameServicei HostsFileNameServicestatičke klase članova.

Umetanje sučelja u sučelja

Java vam također omogućuje deklariranje sučelja unutar sučelja. U ovom je slučaju ugniježđeno sučelje statični član svog zatvorenog sučelja i opet je staticključna riječ suvišna. Također, ugniježđeno sučelje je implicitno javno. Evo primjera:

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

Zatvorenom sučelju pristupate dodavanjem prefiksa njegovom imenu s imenom priloženog sučelja i operatorom pristupa članova. Na primjer, navedite EnclosingInterface.EnclosedInterface1za pristup EnclosedInterface1.

Ugniježđena sučelja u okviru Java Collections Framework

Okvir Java Collections pruža uvid u korisnost gniježđenja jednog sučelja u drugo. Razmotrimo java.util.Mapsučelje koje opisuje kartu (zbirku parova ključ / vrijednost). MapSučelje oduzme što to znači biti karta. Klase poput HashMapi java.util.TreeMapimplementacije Map, koje opisuju različite vrste implementacija karata.

Mapizjavljuje Entrykao jednog od svojih članova. Entryje ugniježđeno sučelje koje opisuje par ključ / vrijednost. EntrySučelje je proglašen Mapzbog bliskog odnosa između dva sučelja - svaki ulaz mora pripadati karte. Entryimplementiraju java.util.AbstractMapklase SimpleEntryi klase SimpleImmutableEntrystatičkih članova. Obično ćete zanemariti ove statične klase članova i Map.Entryumjesto toga komunicirati s njima .

Klase gniježđenja u sučeljima

Jedna od značajki Java nepoznatog jezika je sposobnost ugniježđivanja klase unutar sučelja. Kao i kod ugniježđenog sučelja, ugniježđena klasa je implicitno javna i statična. Evo primjera:

 interface EnclosingInterface { class EnclosedClass { } } 

Unatoč svojoj neobičnosti, sposobnost ugniježđenja klase unutar sučelja može biti korisno, pogotovo kada postoji uska veza između priloženog sučelja i zatvorene klase. Snimanje ovog odnosa poboljšava čitljivost izvornog koda. U slučajevima kada klasa i sučelje nose isto ime, gniježđenje vam također može pomoći da izbjegnete sukob imena između njih.

Primjer: Adresibilno sučelje zatvara klasu adrese

Pretpostavimo da želite modelirati adresabilne cjeline kao što su pisma, razglednice i paketi. Svaki će entitet opisivati ​​njegova vlastita klasa, ali svi oni dijele zajedništvo adresiranja na neko odredište. Svaka klasa može biti dizajnirana s dupliciranim poljima adrese ili biste te detalje mogli apstrahirati u zajedničku superklasu. Alternativno, možete iskoristiti Addressablesučelje popisa 1 .

Popis 1. Adresabilno.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(); } 

AddressableSučelje opisuje adresabilni entitet kao sadrži adresu. Ovu adresu opisuje ugniježđena Addressklasa. getAddress()Metoda provodi god klasa implementira Addressable.

Popis 2 predstavlja izvorni kôd Letterklasi koja implementira Addressable.

Popis 2. Pismo.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; } } 

Letterpohranjuje jedno addresspolje tipa Addressable.Address. Ovu ugniježđenu klasu instancira Letter'konstruktor'. Provedena getAddress()metoda vraća ovaj objekt.

Sada razmislite što se događa kad se tome doda Postcardi Parcelnastava na Addressablesprimjenu. Oglas 3 prikazuje izvornog koda na Addressableszahtjev, koja pokazuje Postcard, Parceli Lettervrste.

Popis 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()); } }

main()Metoda najprije stvara niz Addressableobjekata. Zatim se prevlači preko tih objekata pozivajući se getAddress()na svaki objekt. Metoda vraćenog Addressable.Addressobjekta toString()poziva se System.out.println()da bi se vratila reprezentacija niza objekta i ta se predstavka naknadno izlazi.

Sastavite popis 2 i 3, zajedno sa Postcard.javai Parcel.javakako slijedi:

 javac *.java 

Pokrenite aplikaciju na sljedeći način:

 java Addressables 

Trebali biste promatrati sljedeći rezultat:

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

Ugniježđena sučelja sa statičkim metodama (sučelja statičkih metoda)

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.

Ovu je priču "Gniježđenje s Java sučeljima" izvorno objavio JavaWorld.