Ja esat izlasījis manu Java 101 apmācība, kas iepazīstina ar statiskām klasēm un iekšējām klasēm, jums jāzina pamats darbam ar ligzdotām klasēm Java kodā. Šajā Java padomā jūs uzzināsiet trīs izplatītākos veidus, kā izmantot ligzdošanas paņēmienus ar Java saskarnēm. Es arī īsi parādīšu ligzdošanas saskarnes ar statiskām metodēm, kas pazīstamas arī kā statiskās metodes saskarnes.
Vairāk par Java saskarnēm
Ievadu Java saskarnēs, ieskaitot atšķirību starp klasēm un saskarnēm, skatiet manā Java 101 apmācība Darbs ar saskarnēm Java.
Interfeisu ligzdošana klasēs
Java ļauj deklarēt saskarnes klasēs. Pēc deklarēšanas interfeiss automātiski ir statisks klases loceklis. Nav nepieciešams deklarēt saskarni ar statisks
atslēgvārds. Apsveriet šādu piemēru:
klase EnclosingClass {interfeiss EnclosedInterface1 {} statiskais interfeiss EnclosedInterface2 {}}
EnclosedInterface1
un EnclosedInterface2
ir statiskās dalībnieku saskarnes. Vietējām klasēm nav ekvivalenta, jo saskarnes nevar deklarēt blokos. Tomēr saskarnes var izmantot anonīmā klases kontekstā.
Ligzdotajām saskarnēm parasti nevar piekļūt ārpus tām pievienotajām klasēm. Pretējā gadījumā jūs varētu tos pasludināt par augstākā līmeņa saskarnes. Tā vietā viņiem var piekļūt no viņu norobežojošajām klasēm, kā parādīts šeit:
klase EnclosingClass {interfeiss EnclosedInterface1 {} statiskā saskarne EnclosedInterface2 {} statiskā klase EnclosedClass1 ievieš EnclosedInterface1, EnclosedInterface2 {} class EnclosedClass2 īsteno EnclosedInterface1, EnclosedInterface2 {} void m () {class EnclosedInassface }}
Ņemiet vērā, ka statiskā dalībnieku klase EnclosedClass1
, statisko dalībnieku klase EnclosedClass2
, un vietējā klase EnclosedClass3
ieviest abas ligzdotās saskarnes. Tomēr anonīmā klases kontekstā var ieviest tikai vienu saskarni. (Lai uzzinātu vairāk par anonīmām klasēm, skatiet Java statiskās klases un iekšējās klases.)
Klases ar ligzdotām saskarnēm vietnē java.net
Java standarta klases bibliotēkā ietilpst klases ar ligzdotām saskarnēm. Piemēram, InetAddress
(iekš java.net
pakete), kas apzīmē interneta protokola adresi, paziņo par privātu Adreses
interfeiss, ko ievieš privāts Kešatmiņas adreses
un NameServiceAddresses
statiskās dalībnieku klases. Tas arī pasludina privāto NosaukumsPakalpojums
interfeiss, ko ievieš privāts PlatformNameService
un HostsFileNameService
statiskās dalībnieku klases.
Saskarņu ligzdošana saskarnēs
Java ļauj arī deklarēt saskarnes interfeisu iekšpusē. Šajā gadījumā ligzdotā saskarne ir statīvs tās norobežojošās saskarnes loceklis un vēlreiz statisks
atslēgvārds ir lieks. Arī ligzdotā saskarne ir netieši publiska. Lūk, piemērs:
interfeiss EnclosingInterface {interfeiss EnclosedInterface1 // netieši statisks un publisks {} statisks interfeiss EnclosedInterface2 // nepārprotami statisks un netieši publisks {}}
Jūs piekļūstat slēgtajam interfeisam, pievienojot tā nosaukumu pirms pievienojošā interfeisa nosaukuma un dalībnieka piekļuves operatora. Piemēram, norādiet EnclosingInterface.EnclosedInterface1
piekļūt EnclosedInterface1
.
Ligzdotas saskarnes Java kolekciju sistēmā
Java kolekciju ietvars sniedz ieskatu par viena interfeisa ligzdošanas lietderību citā. Apsveriet java.util.Karte
interfeiss, kas apraksta a karte (atslēgu un vērtību pāru kolekcija). The Karte
interfeiss apkopo, ko nozīmē būt kartei. Tādas klases kā HashMap
un java.util.TreeMap
ieviest Karte
, aprakstot dažādus karšu ieviešanas veidus.
Karte
paziņo Ieraksts
kā viens no tās locekļiem. Ieraksts
ir ligzdota saskarne, kas apraksta atslēgu un vērtību pāri. The Ieraksts
saskarne ir deklarēta Karte
abu interfeisu ciešo attiecību dēļ - katram ierakstam jāpieder kartei. Ieraksts
īsteno java.util.AbstractMap
klases SimpleEntry
un SimpleImmutableEntry
statiskās dalībnieku klases. Parasti jūs ignorēsiet šīs statiskās dalībnieku klases un sazināsieties ar tām Karte. Ieeja
tā vietā.
Nodarbību ligzdošana saskarnēs
Viena no Java svešvalodas iezīmēm ir spēja saskarnē ievietot klasi. Tāpat kā ar ligzdoto saskarni, arī ligzdotā klase ir netieši publiska un statiska. Lūk, piemērs:
interfeiss EnclosingInterface {class EnclosedClass {}}
Neskatoties uz dīvainībām, spēja ligzdot klasi saskarnē var būt noderīga, it īpaši, ja starp norobežojošo interfeisu un slēgto klasi pastāv ciešas attiecības. Šīs attiecības uztveršana uzlabo avota koda lasāmību. Gadījumos, kad klasei un interfeisam ir viens un tas pats nosaukums, ligzdošana var arī palīdzēt izvairīties no nosaukuma konflikta starp abiem.
Piemērs: adresējams interfeiss ietver adreses klasi
Pieņemsim, ka vēlaties modelēt adresējamas entītijas, piemēram, vēstules, pastkartes un pakas. Katru entītiju aprakstīs pati sava klase, taču tām visām ir kopīga adrese uz kādu galamērķi. Katru klasi varētu noformēt ar adreses lauku dublikātiem, vai arī jūs varat abstrahēt šīs detaļas kopējā virsklasē. Alternatīvi, jūs varētu izmantot 1. sarakstu Adresējams
interfeiss.
Saraksts 1. Addressable.java
publiskā saskarne Adresējama {public class Address {private String boxNumber; privātā Stīgu iela; privāta Stīgu pilsēta; publiskā adrese (virknes lodziņa numurs, virknes iela, virknes pilsēta) {this.boxNumber = boxNumber; šī. iela = iela; this.city = pilsēta; } public String getBoxNumber () {return boxNumber; } public String getStreet () {atgriešanās iela; } public String getCity () {atgriešanās pilsēta; } public String toString () {return boxNumber + "-" + iela + "-" + pilsēta; }} public Address getAddress (); }
The Adresējams
interfeiss apraksta adresējamu entītiju kā tādu, kas satur adresi. Šo adresi apraksta ligzdotie Adrese
klasē. The getAddress ()
metodi ievieš jebkura klases realizētā metode Adresējams
.
2. sarakstā tiek norādīts avota kods a Vēstule
klase, kas īsteno Adresējams
.
Sarakstā 2. Letter.java
public class Vēstule īsteno Addressable {private Addressable.adreses adrese; public Letter (String boxNumber, String street, String city) {address = new Addressable.Address (boxNumber, iela, pilsēta); } public Address getAddress () {atgriešanās adrese; }}
Vēstule
veikalos vienu adrese
tipa lauks Adresējams. Adrese
. Šo ligzdoto klasi ir izveidojis instant Vēstule
konstruktors. Īstenotā getAddress ()
metode atgriež šo objektu.
Tagad apsveriet, kas notiek, kad mēs pievienojam Pastkarte
un Sūtījums
klases uz Adresāti
pieteikumu. 3. sarakstā tiek parādīts avota kods Adresāti
lietojumprogramma, kas demonstrē Pastkarte
, Sūtījums
, un Vēstule
veidi.
Saraksts 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") , "Pilsēta B"), jauns zemes gabals ("300", "10. avē", "Pilsēta C")}; for (int i = 0; i <adresējamie.length; i ++) System.out.println (adresējamie [i] .getAddress ()); }}
The galvenais ()
metode vispirms izveido masīvu Adresējams
objektiem. Tad tas atkārtojas par šiem objektiem, atsaucoties getAddress ()
uz katra objekta. Atgriezās Adresējams. Adrese
objekta toString ()
metodi izsauc System.out.println ()
lai atgrieztu objekta virknes attēlojumu, un šis attēlojums pēc tam tiek izvadīts.
Apkopojiet 2. un 3. sarakstu kopā ar Pastkarte.java
un Parcel.java
sekojoši:
javac * .java
Palaidiet lietojumprogrammu šādi:
java Adresāti
Jums jāievēro šāda izeja:
100 - Main Street - Town A 200 - Waterfront Drive - Town B 300 - 10. Ave - Town C
Ligzdotas saskarnes ar statiskām metodēm (statiskās metožu saskarnes)
Daudzi izstrādātāji uzskata, ka klases ligzdošana saskarnē pārkāpj objektorientētu programmēšanu un saskarnes mērķi. Tomēr ir labi zināt par šo iespēju, jo ar to var saskarties, uzturot kāda cita kodu. Turklāt tagad, kad saskarnes ir attīstījušās, iekļaujot noklusējuma un statiskās metodes, var rasties papildu iemesli klases ligzdošanai saskarnē. Piemēram, šeit ir lokāla klase, kas ievietota statiskās metodes saskarnē:
saskarne I {static void m () {C klase {}}}
Secinājums
Esmu iepazīstinājis ar trim izplatītiem ligzdošanas paņēmienu izmantošanas veidiem ar Java klasēm un saskarnēm, kā arī parādījis pretrunīgi vērtētu saskarņu ligzdošanas ar statiskām metodēm tehniku. Skatīt pilnu Java 101 apmācība, lai uzzinātu vairāk par ligzdošanu ar statiskām klasēm un Java iekšējām klasēm.
Šo stāstu "Ligzdošana ar Java saskarnēm" sākotnēji publicēja JavaWorld.