Programavimas

Lizdai su „Java“ sąsajomis

Jei perskaitei mano „Java 101“ pamoka, supažindinanti su statinėmis klasėmis ir vidinėmis klasėmis, turėtumėte būti susipažinę su darbo su įdėtomis „Java“ klasėmis pagrindais. Šiame „Java“ patarime sužinosite tris įprastus būdus, kaip naudoti lizdų technologijas naudojant „Java“ sąsajas. Aš taip pat trumpai pademonstruosiu lizdų sąsajas su statiniais metodais, dar vadinamais statinių metodų sąsajomis.

Daugiau apie „Java“ sąsajas

Norėdami sužinoti apie „Java“ sąsajas, įskaitant klases ir sąsajų skirtumus, žr „Java 101“ pamoka Darbas su „Java“ sąsajomis.

Sąsajų lizdai klasėse

„Java“ leidžia deklaruoti sąsajas klasėse. Kai deklaruojama, sąsaja yra automatiškai statinis klasės narys. Nereikia deklaruoti sąsajos su statinis raktinis žodis. Apsvarstykite šį pavyzdį:

 class EnclosingClass {interface EnclosedInterface1 {} statinė sąsaja EnclosedInterface2 {}} 

Uždara sąsaja ir Uždara sąsaja2 yra statinės narių sąsajos. Nėra atitikmens vietinėms klasėms, nes sąsajų negalima deklaruoti blokais. Tačiau sąsajos gali būti naudojamos anoniminiuose klasės kontekstuose.

Į įterptąsias sąsajas paprastai negalima patekti iš anapus jų uždarančių klasių. Priešingu atveju galėtumėte juos paskelbti aukščiausio lygio sąsajos. Vietoj to, jie pasiekiami iš savo uždarų klasių, kaip parodyta čia:

 klasė EnclosingClass {interface EnclosedInterface1 {} statinė sąsaja EnclosedInterface2 {} statinė klasė EnclosedClass1 įgyvendina EnclosedInterface1, EnclosedInterface2 {}} Class EnclosedClass2 įgyvendina EnclosedInterface1, EnclosedInterface2 {} void m () {class EnclosedInassface {class EnclosedInassface }} 

Atkreipkite dėmesį, kad statinio nario klasė Uždara klasė, nestatinė narių klasė EnclosedClass2ir vietinė klasė Uždara klasė3 įdiegti abi įdėtas sąsajas. Tačiau anoniminiame klasės kontekste galima įdiegti tik vieną sąsają. (Norėdami sužinoti daugiau apie anonimines klases, žr. „Java“ statinės klasės ir vidinės klasės.)

Klasės su įdėtomis sąsajomis java.net

Standartinėje „Java“ klasės bibliotekoje yra klasės su įdėtomis sąsajomis. Pavyzdžiui, „InetAddress“ (viduje konors java.net paketas), nurodantis interneto protokolo adresą, skelbia asmeniniu Adresai sąsaja, kurią įgyvendina privatus Talpyklos adresai ir NameServiceAddresses statinių narių klasės. Ji taip pat skelbia privačią „NameService“ sąsaja, kurią įgyvendina privatus „PlatformNameService“ ir HostsFileNameService statinių narių klasės.

Sąsajų lizdai sąsajose

„Java“ taip pat leidžia deklaruoti sąsajas viduje sąsajų. Šiuo atveju įdėta sąsaja yra statinis jos uždarosios sąsajos narys ir dar kartą statinis raktinis žodis yra nereikalingas. Be to, įdėta sąsaja yra netiesiogiai vieša. Štai pavyzdys:

 sąsaja EnclosingInterface {interface EnclosedInterface1 // implicitly static and public {} static interface EnclosedInterface2 // explicitly static and implicitly public {}} 

Galite naudotis uždara sąsaja prieš tai pridedant jos pavadinimą su pridedamosios sąsajos pavadinimu ir narių prieigos operatoriumi. Pavyzdžiui, nurodykite EnclosingInterface.EnclosedInterface1 prieiti Uždara sąsaja.

Įterptosios sąsajos „Java Collections Framework“

„Java Collections Framework“ suteikia informacijos apie vienos sąsajos įdėjimo į kitą naudingumą. Apsvarstykite java.util.Žemėlapis sąsaja, kuri apibūdina a žemėlapis (raktų ir verčių porų rinkinys). Žemėlapis sąsaja apibendrina, ką reiškia būti žemėlapiu. Tokios klasės kaip HashMap ir java.util.TreeMap įgyvendinti Žemėlapis, apibūdinantis įvairius žemėlapių diegimo tipus.

Žemėlapis pareiškia Įėjimas kaip vienas iš jos narių. Įėjimas yra įdėta sąsaja, apibūdinanti raktų ir verčių porą. Įėjimas sąsaja yra deklaruota Žemėlapis dėl abiejų sąsajų glaudaus ryšio - kiekvienas įrašas turi priklausyti žemėlapiui. Įėjimas įgyvendina java.util.AbstractMap klasės „SimpleEntry“ ir „SimpleImmutableEntry“ statinių narių klasės. Paprastai nepaisysite šių statinių narių klasių ir bendrausite su jomis Žemėlapis. Įėjimas vietoj to.

Klasių lizdai sąsajose

Viena iš svetimų „Java“ kalbos ypatybių yra galimybė įterpti klasę sąsajoje. Kaip ir įdėtoje sąsajoje, įdėta klasė yra netiesioginė vieša ir statiška. Štai pavyzdys:

 sąsaja „EnclosingInterface“ {class EnclosedClass {}} 

Nepaisant keistenybių, galimybė susieti klasę sąsajoje gali būti naudinga, ypač kai tarp aptarnaujančios sąsajos ir uždaros klasės yra glaudus ryšys. Užfiksavus šį ryšį, pagerėja šaltinio kodo įskaitomumas. Tais atvejais, kai klasėje ir sąsajoje yra tas pats vardas, lizdas taip pat gali padėti išvengti vardų konflikto tarp jų.

Pavyzdys: adresuojama sąsaja apima adresų klasę

Tarkime, kad norite modeliuoti adresuojamus objektus, tokius kaip laiškai, atvirukai ir siuntiniai. Kiekvieną subjektą apibūdins jo klasė, tačiau jie visi turi bendrą būdą būti adresuojami tam tikrai paskirties vietai. Kiekviena klasė gali būti suprojektuota su pasikartojančiais adreso laukais, arba galite apibendrinti šias detales į bendrą superklasę. Arba galite panaudoti 1 sąrašą Adresuojamas sąsaja.

Sąrašas 1. Addressable.java

 viešoji sąsaja Adresuojama {public class Address {private String boxNumber; privati ​​Styginių gatvė; privatus Styginių miestas; viešasis adresas (String boxNumber, String street, String city) {this.boxNumber = boxNumber; tai. gatvė = gatvė; this.city = miestas; } public String getBoxNumber () {return boxNumber; } public String getStreet () {grįžimo gatvė; } public String getCity () {grįžimo miestas; } public String toString () {return boxNumber + "-" + gatvė + "-" + miestas; }} public address getAddress (); } 

Adresuojamas sąsajoje aprašomas adresuojamas objektas kaip adresas. Šį adresą apibūdina įdėtieji Adresas klasė. „getAddress“ () metodas yra įgyvendinamas bet kokiu klasės įrankiu Adresuojamas.

2 sąraše pateikiamas šaltinio kodas a Laiškas klasė, kuri įgyvendina Adresuojamas.

Sąrašas 2. Letter.java

 public class Laiškas įgyvendina Addressable {private Addressable.adresas adresas; public Letter (String boxNumber, String street, String city) {address = new Addressable.Address (boxNumber, street, city); } public address getAddress () {grąžinimo adresas; }} 

Laiškas parduotuvėse vienas adresas tipo laukas Adresuojamas. Adresas. Šią įdėtą klasę iš karto sukuria Laiškaskonstruktorius. Įgyvendinta „getAddress“ () metodas grąžina šį objektą.

Dabar apsvarstykite, kas atsitiks, kai mes pridėsime Atvirukas ir Siuntinys klasių į Adresatai taikymas. 3 sąraše pateikiamas šaltinio kodas Adresatai programa, kuri parodo Atvirukas, Siuntinysir Laiškas tipai.

Sąrašas 3. Adresatai.java

 public class Addressables {public static void main (String [] args) {Addressable [] addressables = {new Letter ("100", "Main Street", "Town A"), new Postcard ("200", "Waterfront Drive") , „Miestas B“), naujas sklypas („300“, „10-oji ave“, „Miestas C“)}; for (int i = 0; i <adresuojami.length; i ++) System.out.println (adresuojami [i] .getAddress ()); }}

pagrindinis () metodas pirmiausia sukuria masyvą Adresuojamas objektai. Tada jis pakartoja šiuos objektus, remdamasis „getAddress“ () ant kiekvieno objekto. Grįžo Adresuojamas. Adresas objekto toString () metodas remiasi System.out.println () grąžinti eilutės objekto vaizdą, o šis atvaizdavimas vėliau išvedamas.

Sudarykite 2 ir 3 sąrašus kartu su Atvirukas.java ir Siuntinys.java taip:

 javac * .java 

Paleiskite programą taip:

 java Adresatai 

Turėtumėte stebėti šį rezultatą:

 100 - pagrindinė gatvė - A 200 miestas - važiavimas krante - B miestas 300 - 10 ave - miestas C 

Įterptosios sąsajos su statiniais metodais (statinių metodų sąsajos)

Daugelis kūrėjų mano, kad klasės lizdas sąsajoje pažeidžia į objektą orientuotą programavimą ir sąsajos tikslą. Tačiau gerai žinoti apie šią galimybę, nes galite susidurti su ja palaikydami kažkieno kodą. Be to, dabar, kai sąsajos yra įtrauktos į numatytuosius ir statinius metodus, galite susidurti su papildomomis priežastimis, kodėl sąsajoje reikia įdėti klasę. Pavyzdžiui, čia yra vietinė klasė, įdėta į statinio metodo sąsają:

 sąsaja I {static void m () {C klasė {}}} 

Išvada

Pateikiau tris įprastus lizdavimo būdų naudojimo būdus su „Java“ klasėmis ir sąsajomis, taip pat pademonstravau prieštaringai vertinamą sąsajų lizdo su statiniais metodais metodiką. Žiūrėkite visą „Java 101“ pamoka, kad sužinotumėte daugiau apie lizdą su statinėmis klasėmis ir vidinėmis „Java“ klasėmis.

Šią istoriją „Nesting with Java interface“ iš pradžių paskelbė „JavaWorld“.

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