Programmering

Indlejrer med Java-grænseflader

Hvis du har læst min Java 101 tutorial introducerer statiske klasser og indre klasser, skal du være fortrolig med det grundlæggende i at arbejde med indlejrede klasser i Java-kode. I dette Java-tip lærer du tre almindelige måder at bruge indlejringsteknikker med Java-grænseflader på. Jeg vil også kort demonstrere indlejrende grænseflader med statiske metoder, også kendt som statiske metodegrænseflader.

Mere om Java-grænseflader

For en introduktion til Java-grænseflader, herunder forskellen mellem klasser og grænseflader, se min Java 101 tutorial Arbejde med grænseflader i Java.

Indlejrende grænseflader i klasser

Java giver dig mulighed for at erklære grænseflader inde i klasser. Når de er erklæret, er en grænseflade automatisk et statisk medlem af klassen. Der er ikke behov for at erklære grænsefladen til statisk nøgleord. Overvej følgende eksempel:

 klasse EnclosingClass {interface EnclosedInterface1 {} statisk interface EnclosedInterface2 {}} 

Vedlagt grænseflade 1 og Lukket grænseflade2 er statiske medlemsgrænseflader. Der svarer ikke til lokale klasser, fordi grænseflader ikke kan erklæres i blokke. Imidlertid kan grænseflader bruges i anonyme klassekontekster.

Der er typisk ikke adgang til indlejrede grænseflader ud over deres vedlagte klasser. Ellers kan du erklære dem som grænseflader på øverste niveau. I stedet fås adgang til dem indefra deres vedlagte klasser, som vist her:

 klasse EnclosingClass {interface EnclosedInterface1 {} statisk interface EnclosedInterface2 {} statisk klasse EnclosedClass1 implementerer EnclosedInterface1, EnclosedInterface2 {} klasse EnclosedClass2 implementerer EnclosedInterface1, EnclosedInterface2 {} ugyldig m () {class EnclosedClassInterface} (EnclosedClassInterface) }} 

Bemærk, at statisk medlemsklasse VedlagtKlasse1, ikke-statisk medlemsklasse LukketKlasse2og lokal klasse VedlagtKlasse3 implementere begge indlejrede grænseflader. Imidlertid kan kun en grænseflade implementeres i en anonym klassekontekst. (Se Statiske klasser og indre klasser i Java for mere om anonyme klasser.)

Klasser med indlejrede grænseflader i java.net

Java's standard klassebibliotek inkluderer klasser med indlejrede grænseflader. For eksempel, InetAddress (i java.net pakke), der repræsenterer en internetprotokoladresse, erklærer en privat Adresser interface, der er implementeret af private Cache-adresser og NameServiceAddresses statiske medlemsklasser. Det erklærer også en privat NameService interface, der er implementeret af private PlatformNameService og HostsFileNameService statiske medlemsklasser.

Indlejrende grænseflader i grænseflader

Java giver dig også mulighed for at erklære grænseflader inde i grænseflader. I dette tilfælde er en indlejret grænseflade et statisk medlem af dens vedlagte grænseflade, og endnu en gang statisk nøgleord er overflødigt. Den indlejrede grænseflade er også implicit offentlig. Her er et eksempel:

 interface EnclosingInterface {interface EnclosedInterface1 // implicit statisk og offentlig {} statisk interface EnclosedInterface2 // eksplicit statisk og implicit offentlig {}} 

Du får adgang til en lukket grænseflade ved at prefikse dens navn med den vedlagte grænseflades navn og medlemsadgangsoperatør. Angiv f.eks EnclosingInterface.EnclosedInterface1 adgang Vedlagt grænseflade 1.

Indlejrede grænseflader i Java Collections Framework

Java Collections Framework giver indsigt i nytten af ​​at indlejre en grænseflade i en anden. Overvej java.util.Kort interface, der beskriver en kort (en samling nøgleværdipar). Det Kort interface abstraktion, hvad det betyder at være et kort. Klasser som HashMap og java.util.TreeMap implementere Kort, der beskriver forskellige typer kortimplementeringer.

Kort erklærer Indgang som et af dets medlemmer. Indgang er en indlejret grænseflade, der beskriver et nøgleværdipar. Det Indgang interface er erklæret i Kort på grund af det tætte forhold mellem de to grænseflader - hver post skal tilhøre et kort. Indgang er implementeret af java.util.AbstractMap klassens SimpleEntry og SimpleImmutableEntry statiske medlemsklasser. Du ignorerer typisk disse statiske medlemsklasser og interagerer med Kort. Indgang i stedet.

Nestende klasser i grænseflader

En af Java's fremmedsprogsfunktioner er evnen til at rede en klasse inde i en grænseflade. Som med en indlejret grænseflade er den indlejrede klasse implicit offentlig og statisk. Her er et eksempel:

 interface EnclosingInterface {class EnclosedClass {}} 

På trods af sin mærkelighed kan det være nyttigt at være i stand til at rede en klasse inde i en grænseflade, især når der er et tæt forhold mellem den lukkede grænseflade og den lukkede klasse. Indfangning af dette forhold forbedrer kildekodens læsbarhed. I tilfælde, hvor klassen og grænsefladen har samme navn, kan indlejring også hjælpe dig med at undgå en navnekonflikt mellem de to.

Eksempel: Adresserbar grænseflade omslutter adresseklasse

Antag, at du vil modellere adresserbare enheder som breve, postkort og pakker. Hver enhed vil blive beskrevet af sin egen klasse, men de deler alle det fælles at være adresserbar til en eller anden destination. Hver klasse kunne designes med duplikerede adressefelter, eller du kan abstrakte disse detaljer til en fælles superklasse. Alternativt kan du udnytte liste 1's Adresserbar interface.

Fortegnelse 1. Adresserbar.java

 offentlig grænseflade Adresserbar {offentlig klasse Adresse {privat String boxNumber; privat String street; privat String by; public Address (String boxNumber, String street, String city) {this.boxNumber = boxNumber; denne.gade = gade; this.city = by; } offentlig String getBoxNumber () {return boxNumber; } offentlig String getStreet () {retur gade; } public String getCity () {return city; } offentlig String toString () {return boxNumber + "-" + street + "-" + city; }} offentlig adresse getAddress (); } 

Det Adresserbar interface beskriver en adresserbar enhed som indeholdende en adresse. Denne adresse er beskrevet af den indlejrede Adresse klasse. Det getAddress () metoden er implementeret af uanset klasse implementerer Adresserbar.

Liste 2 viser kildekoden til a Brev klasse, der implementerer Adresserbar.

Notering 2. Letter.java

 offentlig klasse Brevimplementer Adresserbar {privat adresserbar adresse adresse; public Letter (String boxNumber, String street, String city) {address = new Addressable.Address (boxNumber, street, city); } offentlig adresse getAddress () {returadresse; }} 

Brev gemmer en enkelt adresse felt af typen Adresserbar. Adresse. Denne indlejrede klasse er instanseret af Brevs konstruktør. Den implementerede getAddress () metoden returnerer dette objekt.

Overvej nu, hvad der sker, når vi tilføjer Postkort og Parcel klasser til Adresserbare Ansøgning. Liste 3 viser kildekoden til en Adresserbare ansøgning, som viser Postkort, Parcelog Brev typer.

Fortegnelse 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"), ny pakke ("300", "10th Ave", "Town C")}; for (int i = 0; i <addressables.length; i ++) System.out.println (addressables [i] .getAddress ()); }}

Det hoved () metoden opretter først en matrix af Adresserbar genstande. Det gentager sig derefter over disse objekter og påberåber sig getAddress () på hvert objekt. De vendte tilbage Adresserbar. Adresse objekt toString () metode påberåbes af System.out.println () at returnere en strengrepræsentation af objektet, og denne repræsentation udsendes derefter.

Kompilér lister 2 og 3 sammen med Postkort.java og Pakke.java som følger:

 javac * .java 

Kør applikationen som følger:

 java adresserbare 

Du skal overholde følgende output:

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

Indlejrede grænseflader med statiske metoder (statiske metodegrænseflader)

Mange udviklere mener, at indlejring af en klasse i en grænseflade krænker objektorienteret programmering og formålet med en grænseflade. Det er dog godt at vide om denne mulighed, fordi du muligvis støder på den, når du opretholder en andens kode. Desuden, nu hvor grænseflader har udviklet sig til at omfatte standard- og statiske metoder, kan du muligvis støde på yderligere grunde til at rede en klasse i en grænseflade. Som et eksempel er her en lokal klasse indlejret i en statisk metodeinterface:

 interface I {statisk ugyldigt m () {klasse C {}}} 

Konklusion

Jeg har præsenteret tre almindelige måder at bruge indlejringsteknikker med Java-klasser og grænseflader på og demonstreret en kontroversiel teknik til indlejring af grænseflader med statiske metoder. Se det komplette Java 101 tutorial til at lære mere om indlejring med statiske klasser og indre klasser i Java.

Denne historie, "Nesting with Java interfaces", blev oprindeligt udgivet af JavaWorld.