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 Brev
sin 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.