Programmering

Hekker med Java-grensesnitt

Hvis du har lest min Java 101 tutorial som introduserer statiske klasser og indre klasser, bør du være kjent med det grunnleggende om å jobbe med nestede klasser i Java-kode. I dette Java-tipset lærer du tre vanlige måter å bruke hekkende teknikker med Java-grensesnitt på. Jeg vil også kort demonstrere hekkende grensesnitt med statiske metoder, også kjent som statiske metodegrensesnitt.

Mer om Java-grensesnitt

For en introduksjon til Java-grensesnitt, inkludert forskjellen mellom klasser og grensesnitt, se min Java 101 tutorial Arbeide med grensesnitt i Java.

Hekkende grensesnitt i klasser

Java lar deg erklære grensesnitt inne i klasser. Når det er erklært, er et grensesnitt automatisk et statisk medlem av klassen. Det er ikke nødvendig å erklære grensesnittet med statisk nøkkelord. Tenk på følgende eksempel:

 class EnclosingClass {interface EnclosedInterface1 {} statisk grensesnitt EnclosedInterface2 {}} 

Vedlagt grensesnitt1 og Vedlagt grensesnitt2 er statiske medlemsgrensesnitt. Det tilsvarer ikke lokale klasser fordi grensesnitt ikke kan deklareres i blokker. Imidlertid kan grensesnitt brukes i anonyme klassesammenhenger.

Nestede grensesnitt er vanligvis ikke tilgjengelig fra andre enn vedlagte klasser. Ellers kan du erklære dem som grensesnitt på toppnivå. I stedet får du tilgang til dem fra innsiden av sine 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}, EnclosedClass3 }} 

Merk at statisk medlemsklasse VedlagtKlasse1, ikke-statisk medlemsklasse VedlagtKlasse2, og lokal klasse VedlagtKlasse3 implementere begge nestede grensesnittene. Imidlertid kan bare ett grensesnitt implementeres i en anonym klassekontekst. (Se Statiske klasser og indre klasser i Java for mer om anonyme klasser.)

Klasser med nestede grensesnitt i java.net

Java standard klassebibliotek inkluderer klasser med nestede grensesnitt. For eksempel, InetAddress (i java.net pakke), som representerer en Internet Protocol-adresse, erklærer en privat Adresser grensesnitt som er implementert av private Bufrede adresser og Navneserviceadresser statiske medlemsklasser. Det erklærer også en privat NameService grensesnitt som er implementert av private PlatformNameService og HostsFileNameService statiske medlemsklasser.

Hekkende grensesnitt i grensesnitt

Java lar deg også deklarere grensesnitt inne i grensesnittene. I dette tilfellet er et nestet grensesnitt et statisk medlem av det vedlagte grensesnittet, og igjen statisk nøkkelord er overflødig. Det nestede grensesnittet er også implisitt offentlig. Her er et eksempel:

 grensesnitt EnclosingInterface {grensesnitt EnclosedInterface1 // implisitt statisk og offentlig {} statisk grensesnitt EnclosedInterface2 // eksplisitt statisk og implisitt offentlig {}} 

Du får tilgang til et lukket grensesnitt ved å foran navnet på det vedlagte grensesnittets navn og medlemstilgangsoperatør. Spesifiser for eksempel EnclosingInterface.EnclosedInterface1 å få tilgang Vedlagt grensesnitt1.

Nestede grensesnitt i Java Collections Framework

Java Collections Framework gir innsikt i nytten av å hekke et grensesnitt i et annet. Vurder java.util.Kart grensesnitt, som beskriver en kart (en samling nøkkelverdipar). De Kart grensesnittet abstrakte hva det vil si å være et kart. Klasser som HashMap og java.util.TreeMap implementere Kart, som beskriver forskjellige typer kartimplementeringer.

Kart erklærer Inngang som et av medlemmene. Inngang er et nestet grensesnitt som beskriver et nøkkelverdipar. De Inngang grensesnitt er erklært i Kart på grunn av det nære forholdet mellom de to grensesnittene - hver oppføring må tilhøre et kart. Inngang er implementert av java.util.AbstractMap klassen SimpleEntry og SimpleImmutableEntry statiske medlemsklasser. Du vil vanligvis ignorere disse statiske medlemsklassene og samhandle med Kart. Inngang i stedet.

Hekkende klasser i grensesnitt

En av Java's fremmed språkfunksjoner er muligheten til å hekke en klasse i et grensesnitt. Som med et nestet grensesnitt, er den nestede klassen implisitt offentlig og statisk. Her er et eksempel:

 grensesnitt EnclosingInterface {class EnclosedClass {}} 

Til tross for sin merkelighet kan det være nyttig å kunne hekke en klasse i et grensesnitt, spesielt når det er et tett forhold mellom det omsluttende grensesnittet og den vedlagte klassen. Å fange dette forholdet forbedrer kildekodens lesbarhet. I tilfeller der klassen og grensesnittet har samme navn, kan nesting også hjelpe deg med å unngå navnekonflikt mellom de to.

Eksempel: Adresserbart grensesnitt omslutter adresseklasse

Anta at du vil modellere adresserbare enheter som bokstaver, postkort og pakker. Hver enhet vil bli beskrevet av sin egen klasse, men de deler alle det felles å være adresserbart til et eller annet mål. Hver klasse kan utformes med dupliserte adressefelt, eller du kan abstrakte disse detaljene til en vanlig superklasse. Alternativt kan du utnytte Listing 1's Adresserbar grensesnitt.

Oppføring 1. Adresserbar.java

 offentlig grensesnitt Adresserbart {public class Address {private String boxNumber; privat String street; private String city; public Address (String boxNumber, String street, String city) {this.boxNumber = boxNumber; denne.gaten = gate; this.city = by; } public String getBoxNumber () {return boxNumber; } offentlig streng getStreet () {retur gate; } public String getCity () {return city; } public String toString () {return boxNumber + "-" + street + "-" + city; }} offentlig adresse getAddress (); } 

De Adresserbar grensesnitt beskriver en adresserbar enhet som inneholder en adresse. Denne adressen er beskrevet av den nestede Adresse klasse. De getAddress () metoden er implementert av hva som helst klasseverktøy Adresserbar.

Oppføring 2 presenterer kildekoden til a Brev klasse som implementerer Adresserbar.

Oppføring 2. Letter.java

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

Brev lagrer en singel adresse felt av typen Adresserbar. Adresse. Denne nestede klassen er instantiert av Brevsin konstruktør. Det implementerte getAddress () metoden returnerer dette objektet.

Vurder nå hva som skjer når vi legger til Postkort og Pakke klasser til Adresserbare applikasjon. Oppføring 3 presenterer kildekoden til en Adresserbare applikasjon, som demonstrerer Postkort, Pakke, og Brev typer.

Oppføring 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 ()); }}

De hoved() metoden oppretter først en rekke Adresserbar gjenstander. Det gjentar seg deretter over disse objektene, påkaller getAddress () på hvert objekt. De returnerte Adresserbar. Adresse objektets toString () metode påkalles av System.out.println () for å returnere en strengrepresentasjon av objektet, og denne representasjonen blir deretter sendt ut.

Kompilere lister 2 og 3 sammen med Postkort.java og Pakke.java som følger:

 javac * .java 

Kjør applikasjonen som følger:

 java adresser 

Du bør følge følgende utdata:

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

Nestede grensesnitt med statiske metoder (statiske metodegrensesnitt)

Mange utviklere mener at nesting av en klasse i et grensesnitt bryter med objektorientert programmering og formålet med et grensesnitt. Det er imidlertid godt å vite om denne muligheten fordi du kan støte på den når du vedlikeholder andres kode. Videre, nå som grensesnitt har utviklet seg til å inkludere standard- og statiske metoder, kan du støte på flere grunner til å hekke en klasse i et grensesnitt. Som et eksempel, her er en lokal klasse nestet i et statisk metodegrensesnitt:

 grensesnitt I {statisk tomrom m () {klasse C {}}} 

Konklusjon

Jeg har presentert tre vanlige måter å bruke hekkende teknikker med Java-klasser og grensesnitt på, og har også vist en kontroversiell teknikk for å hekke grensesnitt med statiske metoder. Se hele Java 101 opplæring for å lære mer om hekking med statiske klasser og indre klasser i Java.

Denne historien, "Nesting with Java interfaces" ble opprinnelig utgitt av JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found