Programiranje

Vmesniki v Javi

Vmesniki Java se razlikujejo od razredov, zato je pomembno vedeti, kako uporabiti njihove posebne lastnosti v programih Java. Ta vadnica predstavlja razliko med razredi in vmesniki, nato vas vodi skozi primere, ki prikazujejo, kako prijaviti, implementirati in razširiti vmesnike Java.

Izvedeli boste tudi, kako se je vmesnik razvil v Javi 8 z dodatki privzetih in statičnih metod ter v Javi 9 z novimi zasebnimi metodami. Ti dodatki naredijo vmesnike bolj uporabne za izkušene razvijalce. Na žalost zabrišejo tudi meje med razredi in vmesniki, zato programiranje vmesnikov še bolj zmede začetnike Java.

prenos Prenesite kodo Prenesite izvorno kodo, na primer programe v tej vadnici. Ustvaril Jeff Friesen za JavaWorld.

Kaj je vmesnik Java?

An vmesnik je točka, kjer se dva sistema srečata in medsebojno sodelujeta Na primer, lahko z vmesnikom avtomata izberete izdelek, ga plačate in prejmete izdelek s hrano ali pijačo. S programskega vidika se vmesnik nahaja med komponentami programske opreme. Upoštevajte, da je vmesnik glave metode (ime metode, seznam parametrov itd.) Postavljen med zunanjo kodo, ki prikliče metodo, in kodo znotraj metode, ki bo izvedena kot rezultat klica. Tu je primer:

System.out.println (povprečje (10, 15)); dvojno povprečje (dvojni x, dvojni y) // vmesnik med povprečnim (10, 15) klicem in povratkom (x + y) / 2; {vrnitev (x + y) / 2; }

Začetnike Java pogosto zmede, da imajo razredi tudi vmesnike. Kot sem pojasnil v Javi 101: Razredi in predmeti v Javi, je vmesnik del razreda, ki je dostopen kodi zunaj njega. Vmesnik razreda je sestavljen iz neke kombinacije metod, polj, konstruktorjev in drugih entitet. Razmislite o seznamu 1.

Seznam 1. Razred Account in njegov vmesnik

razred Račun {ime zasebnega niza; zasebni dolg znesek; Račun (ime niza, dolg znesek) {this.name = ime; setAmount (znesek); } neveljavna vloga (dolg znesek) {this.amount + = znesek; } String getName () {return ime; } long getAmount () {vrnjeni znesek; } void setAmount (dolg znesek) {this.amount = znesek; }}

The Račun (ime niza, dolg znesek) konstruktor in neveljavna vloga (dolg znesek), String getName (), long getAmount (), in void setAmount (dolg znesek) metode iz račun vmesnik razreda: dostopni so zunanji kodi. The ime zasebnega niza; in zasebni dolg znesek; polja so nedostopna.

Več o vmesnikih Java

Kaj lahko storite z vmesniki v programih Java? Pridobite pregled z Jeffovimi šestimi vlogami vmesnika Java.

Koda metode, ki podpira vmesnik metode, in tisti del razreda, ki podpira vmesnik razreda (na primer zasebna polja), je znan kot metoda ali razred izvajanje. Implementacija mora biti skrita pred zunanjo kodo, tako da jo je mogoče spremeniti, da ustreza razvijajočim se zahtevam.

Ko so izvedbe izpostavljene, lahko pride do soodvisnosti med komponentami programske opreme. Na primer, koda metode se lahko zanaša na zunanje spremenljivke, uporabniki razreda pa so lahko odvisni od polj, ki bi morala biti skrita. To sklopka lahko povzroči težave, ko se morajo razvijati izvedbe (morda je treba odstraniti izpostavljena polja).

Razvijalci Java tako uporabljajo funkcijo jezika vmesnika za abstrahiranje vmesnikov razredov ločevanje razrede svojih uporabnikov. Če se namesto razredov osredotočite na vmesnike Java, lahko zmanjšate število sklicev na imena razredov v izvorni kodi. To olajša prehod iz enega razreda v drugega (morda za izboljšanje zmogljivosti), ko vaša programska oprema dozori. Tu je primer:

Imena seznamov = new ArrayList () void print (Imena seznamov) {// ...}

Ta primer razglasi in inicializira a imena polje, ki shranjuje seznam imen nizov. Primer tudi navaja a natisni () način tiskanja vsebine seznama nizov, morda en niz na vrstico. Zaradi kratkosti sem izpustil izvedbo metode.

Seznam je vmesnik Java, ki opisuje zaporedno zbirko predmetov. ArrayList je razred, ki opisuje izvedbo Seznam Java vmesnik. Nov primerek ArrayList razred pridobljen in dodeljen Seznam spremenljivka imena. (Seznam in ArrayList so shranjeni v standardni knjižnici razredov java.util paket.)

Kotni oklepaji in generični izdelki

Kotni oklepaji (< in >) so del nabora Java generičnih funkcij. To nakazujejo imena opisuje seznam nizov (na njem so lahko shranjeni samo nizi). Generične izdelke bom predstavil v prihodnjem članku o Javi 101.

Ko odjemalska koda komunicira z imena, se bo skliceval na tiste metode, ki jih je razglasil Seznam, ki jih izvaja ArrayList. Koda odjemalca ne bo neposredno komunicirala ArrayList. Posledično se odjemalska koda ne bo zlomila, ko bo drug razred izvedbe, na primer LinkedList, je potrebno:

Imena seznamov = novo LinkedList () // ... void print (Imena seznamov) {// ...}

Zaradi natisni () vrsta parametra metode je Seznam, izvedbe te metode ni treba spremeniti. Če pa bi bila vrsta ArrayList, tip bi bilo treba spremeniti v LinkedList. Če bi oba razreda razglasila lastna unikatna načina, boste morda morali bistveno spremeniti natisni ()izvajanje.

Ločitev Seznam iz ArrayList in LinkedList vam omogoča pisanje kode, ki je odporna na spremembe izvedbe razreda. Z uporabo vmesnikov Java se lahko izognete težavam, ki bi lahko nastale zaradi zanašanja na izvedbene razrede. To ločevanje je glavni razlog za uporabo vmesnikov Java.

Izjava o vmesnikih Java

Vmesnik prijavite tako, da upoštevate skladbo, podobno razredu, ki je sestavljena iz glave, ki ji sledi telo. Glava je vsaj sestavljena iz ključne besede vmesnik čemur sledi ime, ki identificira vmesnik. Telo se začne z odprtim oklepajem in konča s tesnim oklepajem. Med temi ločili so konstante in izjave glave metode:

vmesnik identifikator {// telo vmesnika}

Po dogovoru je prva črka imena vmesnika velika, naslednje črke pa male (na primer Risljivo). Če je ime sestavljeno iz več besed, je prva črka vsake besede velika (npr DrawableAndFillable). Ta konvencija o poimenovanju je znana kot CamelCasing.

Seznam 2 navaja vmesnik z imenom Risljivo.

Seznam 2. Primer vmesnika Java

vmesnik Drawable {int RED = 1; int ZELENA = 2; int MODRA = 3; int ČRNA = 4; int BELA = 5; neveljavno žrebanje (int barva); }

Vmesniki v standardni knjižnici razredov Java

Kot dogovor o poimenovanju se številni vmesniki v standardni knjižnici razredov Java končajo z sposoben končnico. Primeri vključujejo Klicljivo, Klonirano, Primerljivo, Oblika, Ponovljivo, Teče, Serializabilno, in Prenosljiv. Pripona pa ni obvezna; standardna knjižnica razredov vključuje vmesnike CharSequence, Odložišče Lastnik, Zbirka, Izvršitelj, Prihodnost, Iterator, Seznam, Zemljevid in mnogi drugi.

Risljivo razglasi pet polj, ki določajo barvne konstante. Ta vmesnik razglasi tudi glavo za žreb () metoda, ki jo je treba poklicati z eno od teh konstant, da določite barvo, uporabljeno za risanje orisa. (Uporaba celoštevilskih konstant ni dobra ideja, ker bi bilo mogoče prenesti katero koli celoštevilčno vrednost žreb (). Vendar pa zadostujejo v preprostem primeru.)

Privzete vrednosti polja in glave metode

Polja, ki so deklarirana v vmesniku, so implicitno javni končni statični. Glave metod vmesnika so implicitno javni povzetek.

Risljivo identificira referenčni tip, ki določa, kaj storiti (nekaj narisati), ne pa tudi, kako to storiti. Podrobnosti o izvedbi se pošljejo v razrede, ki izvajajo ta vmesnik. Primeri takšnih razredov so znani kot risalni predmeti, ker se znajo risati.

Označevalni in označevalni vmesniki

Vmesnik s praznim telesom je znan kot označevalni vmesnik ali a označevalni vmesnik. Vmesnik obstaja samo za povezovanje metapodatkov z razredom. Na primer, Klonirano (glej Dedovanje v Javi, 2. del) pomeni, da je primere njenega izvedbenega razreda mogoče plitvo klonirati. Kdaj Predmetje klon () metoda zazna (s pomočjo identifikacije vrste izvajalnega okolja), ki jo izvaja razred kličočega primerka Klonirano, objekt plitvo klonira.

Izvajanje vmesnikov Java

Razred izvaja vmesnik z dodajanjem Jave izvaja ključni besedi, ki ji sledi seznam imen vmesnikov, ločenih z vejicami, v glavo razreda in s kodiranjem vsake vmesniške metode v razredu. Seznam 3 predstavlja razred, ki izvaja seznam 2 Risljivo vmesnik.

Seznam 3. Krog, ki izvaja vmesnik Drawable

class Circle implementira Drawable {private double x, y, radius; Krog (dvojni x, dvojni y, dvojni polmer) {this.x = x; to.y = y; this.radius = polmer; } @Override public void draw (int color) {System.out.println ("Krog narisan na (" + x + "," + y + "), s polmerom" + polmer + "in barvo" + barva); } dvojni getRadius () {polmer vrnitve; } double getX () {return x; } dvojno getY () {vrni y; }}

Seznam 3 Krog razred opisuje krog kot središčno točko in polmer. Poleg zagotavljanja konstruktorja in ustreznih metod pridobivanja, Krog izvaja Risljivo vmesnik z dodajanjem izvaja Drawable do Krog glavo in s preglasitvijo (kot je označeno z @Override pripis) Risljivoje žreb () glavo metode.

Seznam 4 predstavlja drugi primer: a Pravokotnik razred, ki tudi izvaja Risljivo.

Seznam 4. Implementacija vmesnika Drawable v kontekstu pravokotnika

razred Pravokotnik izvaja Drawable {private double x1, y1, x2, y2; Pravokotnik (dvojni x1, dvojni y1, dvojni x2, dvojni y2) {this.x1 = x1; to.y1 = y1; to.x2 = x2; to.y2 = y2; } @Override public void draw (int color) {System.out.println ("Pravokotnik, izrisan z zgornjim levim vogalom pri (" + x1 + "," + y1 + ") in spodnjem desnem kotu pri (" + x2 + "," + y2 + ") in barva" + barva); } double getX1 () {return x1; } double getX2 () {return x2; } dvojno getY1 () {vrni y1; } dvojno getY2 () {vrni y2; }}

Seznam 4 Pravokotnik class opisuje pravokotnik kot par točk, ki označujejo zgornji levi in ​​spodnji desni vogal te oblike. Kot z Krog, Pravokotnik ponuja konstruktor in ustrezne getter metode ter tudi izvaja Risljivo vmesnik.

Preglasitev glav vmesniških metod

Prevajalnik poroča o napaki, ko poskušate zbrati ne-povzetek razred, ki vključuje izvaja vmesniška klavzula, vendar ne preglasi vseh glav vmesnikovih metod.

Podatkovne vrednosti vrste vmesnika so predmeti, katerih razredi izvajajo vmesnik in katerih vedenja so tista, ki so določena v glavah metode vmesnika. To dejstvo pomeni, da lahko referenci predmeta dodelite spremenljivko vrste vmesnika, pod pogojem, da razred predmeta izvaja vmesnik. Seznam 5 prikazuje.

Seznam 5. Povezovanje objektov kroga in pravokotnika kot risbe

class Draw {public static void main (String [] args) {Drawable [] drawables = new Drawable [] {new Circle (10, 20, 15), new Circle (30, 20, 10), new Rectangle (5, 8 , 8, 9)}; za (int i = 0; i <drawables.length; i ++) risbe [i] .draw (Drawable.RED); }}

Ker Krog in Pravokotnik izvajati Risljivo, Krog in Pravokotnik predmeti imajo Risljivo poleg svojih razredov. Zato je zakonito, da referenco vsakega predmeta shranimo v vrsto Risljivos. Zanka se ponovi nad to matriko in prikliče vsako Risljivo predmeta žreb () metoda za risanje kroga ali pravokotnika.

Ob predpostavki, da je seznam 2 shranjen v datoteki Drawable.java izvorna datoteka, ki je v istem imeniku kot Krog.java, Pravokotnik.java, in Narišite.java izvorne datoteke (ki shranjujejo seznam 3, seznam 4 in seznam 5), prevedite te izvorne datoteke prek ene od naslednjih ukaznih vrstic:

javac Draw.java javac * .java

Zaženite Nariši na naslednji način:

java Risba

Upoštevati morate naslednje rezultate:

Krog, narisan v (10,0, 20,0), s polmerom 15,0, in barva 1 Krog, narisan v (30,0, 20,0), s polmerom 10,0, in barva 1 pri (8,0, 9,0) in barva 1

Upoštevajte, da lahko enake rezultate ustvarite tudi tako, da določite naslednje glavni () metoda:

public static void main (String [] args) {Krog c = nov krog (10, 20, 15); c.razris (Drawable.RED); c = nov krog (30, 20, 10); c.razris (Drawable.RED); Pravokotnik r = nov pravokotnik (5, 8, 8, 9); r.razris (Drawable.RED); }

Kot lahko vidite, je dolgočasno večkrat priklicati posamezne predmete žreb () metoda. Poleg tega s tem dodate dodatno bajtno kodo Narišidatoteka predavanja. Z mislijo na Krog in Pravokotnik kot RisljivoZa poenostavitev kode lahko uporabite matriko in preprosto zanko. To je dodatna prednost oblikovanja kode, ki daje prednost vmesnikom kot razredom.

Pozor!

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