Če ste prebrali mojo Java 101 Vadnica, ki uvaja statične razrede in notranje razrede, bi morali poznati osnove dela z ugnezdenimi razredi v kodi Java. V tem nasvetu za Javo boste spoznali tri pogoste načine uporabe tehnik gnezdenja z vmesniki Java. Na kratko bom tudi prikazal gnezdeče vmesnike s statičnimi metodami, znanimi tudi kot vmesniki statičnih metod.
Več o vmesnikih Java
Za uvod v vmesnike Java, vključno z razliko med razredi in vmesniki, glejte moj Java 101 vadnica Delo z vmesniki v Javi.
Gnezdenje vmesnikov v razredih
Java vam omogoča izjavo o vmesnikih znotraj razredov. Ko je vmesnik samodejno razglašen, je samodejno statični član razreda. Vmesnika z datoteko. Ni treba razglasiti statično
ključna beseda. Upoštevajte naslednji primer:
razred EnclosingClass {vmesnik EnclosedInterface1 {} statični vmesnik EnclosedInterface2 {}}
EnclosedInterface1
in EnclosedInterface2
so statični članski vmesniki. Lokalnim razredom ni enakovrednega, ker vmesnikov ni mogoče prijaviti v blokih. Vendar pa lahko vmesnike uporabljamo v kontekstih anonimnih razredov.
Do ugnezdenih vmesnikov običajno ne dostopajo izven zaprtih razredov. V nasprotnem primeru jih lahko prijavite kot vmesniki najvišje ravni. Namesto tega so do njih dostopni znotraj njihovih zaprtih razredov, kot je prikazano tukaj:
razred EnclosingClass {vmesnik EnclosedInterface1 {} statični vmesnik EnclosedInterface2 {} statični razred EnclosedClass1 izvaja EnclosedInterface1, EnclosedInterface2 {} razred EnclosedClass2 izvaja EnclosedInterface1, EnclosedInterface2 {} void m () {class EnclosedCface Interface EnclosedCface Interface EnclosedCface }}
Upoštevajte ta razred statičnih članov EnclosedClass1
, nestatični razred EnclosedClass2
in lokalni razred EnclosedClass3
implementirati oba ugnezdena vmesnika. Vendar pa je v kontekstu anonimnega razreda mogoče implementirati samo en vmesnik. (Za več informacij o anonimnih predavanjih glejte Statični razredi in notranji razredi v Javi.)
Razredi z ugnezdenimi vmesniki v java.net
Standardna knjižnica razredov Java vključuje razrede z ugnezdenimi vmesniki. Na primer, InetAddress
(v java.net
paket), ki predstavlja naslov internetnega protokola, razglasi za zasebno Naslovi
vmesnik, ki ga izvaja zasebno Predpomnjeni naslovi
in NameServiceAddresses
statični razredi članov. Razglaša tudi zasebnika NameService
vmesnik, ki ga izvaja zasebno PlatformNameService
in HostsFileNameService
statični razredi članov.
Gnezdenje vmesnikov v vmesnikih
Java vam omogoča tudi izjavo o vmesnikih znotraj vmesnikov. V tem primeru je ugnezdeni vmesnik statični član njegovega zaprtega vmesnika in še enkrat statično
ključna beseda je odveč. Prav tako je ugnezdeni vmesnik implicitno javen. Tu je primer:
vmesnik EnclosingInterface {vmesnik EnclosedInterface1 // implicitno statični in javni {} statični vmesnik EnclosedInterface2 // eksplicitno statičen in implicitno javen {}}
Do zaprtega vmesnika dostopate tako, da njegovo ime predpišete z imenom in operaterjem dostopa do člana. Na primer, navedite EnclosingInterface.EnclosedInterface1
dostopati EnclosedInterface1
.
Vgnezdeni vmesniki v ogrodju zbirk Java
Okvir Java Collections omogoča vpogled v koristnost gnezdenja enega vmesnika v drugega. Razmislite o java.util.Map
vmesnik, ki opisuje a zemljevid (zbirka parov ključ / vrednost). The Zemljevid
vmesnik povzame, kaj pomeni biti zemljevid. Razredi, kot so HashMap
in java.util.TreeMap
izvajati Zemljevid
, ki opisuje različne vrste izvedb zemljevidov.
Zemljevid
izjavlja Vstop
kot eden od njegovih članov. Vstop
je ugnezdeni vmesnik, ki opisuje par ključ-vrednost. The Vstop
vmesnik je prijavljen v Zemljevid
zaradi tesne povezanosti obeh vmesnikov - vsak vnos mora pripadati zemljevidu. Vstop
izvaja program java.util.AbstractMap
razredov SimpleEntry
in SimpleImmutableEntry
statični razredi članov. Te statične razrede članov običajno prezrete in z njimi komunicirate Zemljevid.Vstop
namesto tega.
Razredi gnezdenja v vmesnikih
Ena od lastnosti tujega jezika Java je sposobnost gnezdenja razreda znotraj vmesnika. Tako kot pri ugnezdenem vmesniku je ugnezdeni razred implicitno javen in statičen. Tu je primer:
vmesnik EnclosingInterface {class EnclosedClass {}}
Kljub svoji nenavadnosti je lahko gnezdenje razreda znotraj vmesnika koristno, še posebej, če obstaja tesna povezava med zaprtim vmesnikom in zaprtim razredom. Zajemanje tega razmerja izboljša berljivost izvorne kode. V primerih, ko imata razred in vmesnik isto ime, vam lahko z gnezdenjem preprečite navzkrižje imen med njima.
Primer: Naslovljivi vmesnik zajema razred naslovov
Recimo, da želite modelirati naslovljive entitete, kot so pisma, razglednice in paketi. Vsako entiteto bo opisal lasten razred, vendar imajo vsi skupne značilnosti, da jih je mogoče nasloviti na nek cilj. Vsak razred je lahko oblikovan z dvojnimi naslovnimi polji ali pa lahko te podrobnosti povzamete v skupni superrazred. Lahko pa izkoristite seznam 1 Naslovljivo
vmesnik.
Seznam 1. Addressable.java
javni vmesnik Addressable {naslov javnega razreda {private String boxNumber; zasebna String ulica; zasebno mesto String; javni naslov (String boxNumber, String street, String city) {this.boxNumber = boxNumber; this.street = street; this.city = mesto; } javni String getBoxNumber () {return boxNumber; } javni String getStreet () {return street; } javni String getCity () {return city; } javni String toString () {return boxNumber + "-" + street + "-" + city; }} javni naslov getAddress (); }
The Naslovljivo
vmesnik opisuje naslovljivo entiteto, ki vsebuje naslov. Ta naslov opisuje ugnezdeni Naslov
razred. The getAddress ()
metoda se izvaja s katerim koli razredom Naslovljivo
.
Seznam 2 predstavlja izvorno kodo a Pismo
razred, ki izvaja Naslovljivo
.
Seznam 2. Letter.java
javni razred Letter izvaja Addressable {private Addressable.Address address; javno pismo (String boxNumber, String street, String city) {address = new Addressable.Address (boxNumber, street, city); } javni naslov getAddress () {povratni naslov; }}
Pismo
shrani en sam naslov
polje tipa Naslovljiv. Naslov
. Ta ugnezdeni razred je ustvaril Pismo
je konstruktor. Izvedeno getAddress ()
metoda vrne ta predmet.
Zdaj pa razmislite, kaj se zgodi, ko dodamo Razglednica
in Paket
razredi na Naslovljivi
aplikacijo. Seznam 3 predstavlja izvorno kodo Naslovljivi
aplikacija, ki prikazuje Razglednica
, Paket
, in Pismo
vrste.
Seznam 3. Addressables.java
javni razred Addressables {public static void main (String [] args) {Addressable [] addressables = {new Letter ("100", "Main Street", "Town A"), nova razglednica ("200", "Waterfront Drive" , "Mesto B"), nov paket ("300", "10th Ave", "Mesto C")}; for (int i = 0; i <addressables.length; i ++) System.out.println (addressables [i] .getAddress ()); }}
The glavni ()
metoda najprej ustvari polje Naslovljivo
predmetov. Nato se ponovi nad temi predmeti in prikliče getAddress ()
na vsakem predmetu. Vrnjeni Naslovljiv. Naslov
predmeta toString ()
metoda prikliče System.out.println ()
za vrnitev nizovne predstavitve predmeta in ta predstavitev se nato izpiše.
Sestavite seznam 2 in 3 skupaj z Razglednica.java
in Parcela.java
kot sledi:
javac * .java
Zaženite aplikacijo na naslednji način:
java Addressables
Upoštevati morate naslednje rezultate:
100 - Glavna ulica - Mesto A 200 - Obvodni pogon - Mesto B 300 - 10th Ave - Mesto C
Vgnezdeni vmesniki s statičnimi metodami (vmesniki statičnih metod)
Mnogi razvijalci menijo, da gnezdenje razreda v vmesniku krši objektno usmerjeno programiranje in namen vmesnika. Vendar je dobro vedeti o tej zmožnosti, ker jo lahko naletite pri vzdrževanju kode nekoga drugega. Poleg tega lahko zdaj, ko so se vmesniki razvili tako, da vključujejo privzete in statične metode, naletite na dodatne razloge za gnezdenje razreda v vmesnik. Kot primer je tu lokalni razred, ugnezden v vmesnik statične metode:
vmesnik I {static void m () {class C {}}}
Zaključek
Predstavil sem tri pogoste načine uporabe tehnik gnezdenja z razredi in vmesniki Java ter pokazal tudi kontroverzno tehniko gnezdenja vmesnikov s statičnimi metodami. Glej celotno Java 101 vadnico, če želite izvedeti več o gnezdenju s statičnimi razredi in notranjimi razredi v Javi.
To zgodbo "Gnezdenje z vmesniki Java" je prvotno objavil JavaWorld.