Programmēšana

Ligzdošana ar Java saskarnēm

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ēstulekonstruktors. Ī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.

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