Programovanie

Rozhrania v Jave

Rozhrania Java sa líšia od tried a je dôležité vedieť, ako používať ich špeciálne vlastnosti vo vašich programoch Java. Tento tutoriál predstavuje rozdiel medzi triedami a rozhraniami, potom vás prevedie príkladmi demonštrujúcimi, ako deklarovať, implementovať a rozšíriť rozhrania Java.

Dozviete sa tiež, ako sa rozhranie vyvinulo v prostredí Java 8 s pridaním predvolených a statických metód a v prostredí Java 9 s novými súkromnými metódami. Vďaka týmto doplnkom sú rozhrania užitočnejšie pre skúsených vývojárov. Bohužiaľ tiež stierajú hranice medzi triedami a rozhraniami, čo spôsobuje, že programovanie rozhraní je pre začiatočníkov Java ešte viac mätúce.

stiahnuť Získajte kód Stiahnite si zdrojový kód napríklad pre aplikácie v tejto príručke. Vytvoril Jeff Friesen pre JavaWorld.

Čo je to rozhranie Java?

An rozhranie je bod, v ktorom sa dva systémy stretávajú a interagujú. Môžete napríklad použiť rozhranie automatu na výber položky, zaplatenie za ňu a príjem jedla a nápojov. Z hľadiska programovania je rozhranie umiestnené medzi softvérovými komponentmi. Zvážte, že rozhranie hlavičky metódy (názov metódy, zoznam parametrov atď.) Sa nachádza medzi externým kódom, ktorý volá metódu, a kódom v rámci metódy, ktorá sa vykoná ako výsledok hovoru. Tu je príklad:

System.out.println (priemer (10, 15)); double average (double x, double y) // rozhranie medzi priemerným (10, 15) hovorom a návratom (x + y) / 2; {návrat (x + y) / 2; }

Pre začiatočníkov v oblasti Java je často mätúce to, že triedy majú aj rozhranie. Ako som vysvetlil v Jave 101: Triedy a objekty v Jave, rozhranie je časťou triedy, ktorá je prístupná kódu umiestnenému mimo nej. Rozhranie triedy pozostáva z nejakej kombinácie metód, polí, konštruktorov a ďalších entít. Zvážte zoznam 1.

Výpis 1. Trieda účtu a jej rozhranie

trieda Účet {súkromný názov reťazca; súkromná dlhá suma; Účet (názov reťazca, dlhá suma) {this.name = name; setAmount (suma); } neplatný vklad (dlhá suma) {this.amount + = suma; } Reťazec getName () {návratové meno; } long getAmount () {vratna suma; } void setAmount (dlhé množstvo) {this.amount = suma; }}

The Účet (názov reťazca, dlhá suma) konštruktér a neplatný vklad (dlhá suma), Reťazec getName (), long getAmount ()a void setAmount (dlhé množstvo) metódy tvoria Účet rozhranie triedy: sú prístupné externému kódu. The súkromné ​​meno reťazca; a súkromná dlhá suma; polia sú neprístupné.

Viac informácií o rozhraniach Java

Čo môžete robiť s rozhraniami vo vašich programoch Java? Získajte prehľad so šiestimi rolami Jeffovho rozhrania rozhrania Java.

Kód metódy, ktorý podporuje rozhranie metódy, a časť triedy, ktorá podporuje rozhranie triedy (napríklad súkromné ​​polia), sa nazýva metóda alebo trieda implementácia. Implementácia by mala byť skrytá pred externým kódom, aby ju bolo možné zmeniť tak, aby vyhovovala vyvíjajúcim sa požiadavkám.

Ak dôjde k odhaleniu implementácií, môže dôjsť k vzájomnej závislosti medzi softvérovými komponentmi. Napríklad kód metódy sa môže spoliehať na externé premenné a používatelia triedy sa môžu stať závislými na poliach, ktoré mali byť skryté. Toto spojka môže viesť k problémom, keď sa implementácie musia vyvíjať (možno je potrebné odstrániť exponované polia).

Vývojári Java preto používajú funkciu jazykového rozhrania na abstraktné rozhranie tried oddelenie triedy od svojich používateľov. Ak sa namiesto tried sústredíte na rozhrania Java, môžete vo svojom zdrojovom kóde minimalizovať počet odkazov na názvy tried. To uľahčuje prechod z jednej triedy do druhej (možno kvôli zlepšeniu výkonu), keď váš softvér dozrieva. Tu je príklad:

Názvy zoznamu = nový ArrayList () void print (Názvy zoznamu) {// ...}

Tento príklad deklaruje a inicializuje a mien pole, ktoré obsahuje zoznam názvov reťazcov. Tento príklad tiež deklaruje a print () metóda pre tlač obsahu zoznamu reťazcov, možno jedného reťazca na riadok. Pre stručnosť som vynechal implementáciu metódy.

Zoznam je rozhranie Java, ktoré popisuje postupnú zbierku objektov. ArrayList je trieda, ktorá popisuje implementáciu súboru založeného na poli Zoznam Rozhranie Java. Nová inštancia systému ArrayList trieda získaná a pridelená Zoznam premenná mien. (Zoznam a ArrayList sú uložené v knižnici štandardnej triedy java.util balíček.)

Uhlové zátvorky a všeobecné informácie

Uhlové zátvorky (< a >) sú súčasťou všeobecnej súpravy funkcií Java. Naznačujú to mien popisuje zoznam reťazcov (v zozname je možné uložiť iba reťazce). Generiká predstavím v budúcom článku o Java 101.

Pri interakcii s kódom klienta mien, vyvolá tie metódy, ktoré sú deklarované Zoznam, a ktoré implementuje ArrayList. S kódom klienta nebude priamo komunikovať ArrayList. Výsledkom je, že sa kód klienta nerozbije, keď sa použije iná implementačná trieda, ako napr LinkedList, je povinné:

Názvy zoznamu = nový LinkedList () // ... neplatná tlač (názvy zoznamov) {// ...}

Pretože print () typ parametra metódy je Zoznam, implementácia tejto metódy sa nemusí meniť. Keby však ten typ bol ArrayList, typ by sa musel zmeniť na LinkedList. Ak by obe triedy deklarovali svoje vlastné jedinečné metódy, pravdepodobne budete musieť výrazne zmeniť print ()implementácia.

Oddelenie Zoznam od ArrayList a LinkedList vám umožní napísať kód, ktorý je imúnny voči zmenám implementácie triedy. Použitím rozhraní Java môžete predísť problémom, ktoré by mohli vzniknúť pri spoliehaní sa na implementačné triedy. Toto oddelenie je hlavným dôvodom používania rozhraní Java.

Deklarovanie rozhraní Java

Rozhranie deklarujete dodržaním syntaxe podobnej triede, ktorá sa skladá z hlavičky a za ňou telo. Hlavička pozostáva minimálne z kľúčového slova rozhranie za ktorým nasleduje názov, ktorý identifikuje rozhranie. Telo začína znakom otvorenej zátvorky a končí úzkou zátvorkou. Medzi týmito oddeľovačmi sú konštanty a deklarácie hlavičiek metód:

rozhranie identifikátor {// telo rozhrania}

Podľa konvencie je prvé písmeno názvu rozhrania veľké a ďalšie písmená malé (napríklad Kresliteľné). Ak sa meno skladá z viacerých slov, prvé písmeno každého slova je napísané veľkými písmenami (napríklad DrawableAndFillable). Táto konvencia pomenovania je známa ako CamelCasing.

Výpis 2 deklaruje pomenované rozhranie Kresliteľné.

Zoznam 2. Príklad rozhrania Java

rozhranie Drawable {int RED = 1; int ZELENÁ = 2; int MODRÁ = 3; int ČIERNE = 4; int BIELA ​​= 5; void draw (int color); }

Rozhrania v štandardnej knižnici tried Java

Ako konvencia pomenovania, veľa rozhraní v štandardnej knižnici triedy Java končí s schopný prípona. Príklady zahŕňajú Vyvolávateľná, Cloneable, Porovnateľné, Formovateľný, Iterable, Spustiteľné, Serializovateľnéa Prenosné. Prípona však nie je povinná; štandardná knižnica tried obsahuje rozhrania CharSequence, Vlastník schránky, Zbierka, Exekútor, Budúcnosť, Iterátor, Zoznam, Mapa a veľa ďalších.

Kresliteľné deklaruje päť polí, ktoré identifikujú farebné konštanty. Toto rozhranie tiež deklaruje hlavičku pre a kresliť () metóda, ktorá musí byť volaná s jednou z týchto konštánt na určenie farby použitej na nakreslenie obrysu. (Používanie celočíselných konštánt nie je dobrý nápad, pretože je možné odovzdať akúkoľvek celočíselnú hodnotu kresliť (). Postačujú však na jednoduchom príklade.)

Predvolené hodnoty hlavičky poľa a metódy

Polia, ktoré sú deklarované v rozhraní, sú implicitne verejná záverečná statická. Hlavičky metód rozhrania sú implicitne verejný abstrakt.

Kresliteľné identifikuje referenčný typ, ktorý určuje, čo má robiť (niečo nakresliť), ale nie ako to má urobiť. Podrobnosti implementácie sú odosielané do tried, ktoré implementujú toto rozhranie. Inštancie takýchto tried sú známe ako kresliace, pretože vedia kresliť samy seba.

Rozhrania značiek a značiek

Rozhranie s prázdnym telom je známe ako značkovacie rozhranie alebo a značkovacie rozhranie. Rozhranie existuje iba na priradenie metadát k triede. Napríklad, Cloneable (pozri Dedenie v Jave, časť 2) znamená, že inštancie jeho implementačnej triedy môžu byť povrchne klonované. Kedy Objektje klon () metóda zistí (prostredníctvom identifikácie typu runtime), že trieda volajúcej inštancie implementuje Cloneable, povrchne klonuje objekt.

Implementácia rozhraní Java

Trieda implementuje rozhranie pripojením Java náradie nasledované čiarkou oddeleným zoznamom názvov rozhraní do hlavičky triedy a kódovaním každej metódy rozhrania v triede. Zoznam 3 predstavuje triedu, ktorá implementuje zoznam 2 Kresliteľné rozhranie.

Zoznam 3. Kruh implementujúci rozhranie Drawable

trieda Kruhové náradie Drawable {private double x, y, radius; Kruh (dvojité x, dvojité y, dvojitý polomer) {this.x = x; this.y = y; this.radius = radius; } @Override public void draw (int color) {System.out.println ("Kruh nakreslený na (" + x + "," + y + "), s polomerom" + polomer + "a farbou" + farba); } dvojitý getRadius () {návratový polomer; } dvojité getX () {návrat x; } double getY () {return y; }}

Zoznam 3 Kruh trieda popisuje kružnicu ako stred a polomer. Okrem poskytnutia konštruktora a vhodných getrových metód, Kruh realizuje Kresliteľné rozhranie pripojením náradie Drawable do Kruh hlavičku a prepísaním (podľa označenia @ Override anotácia) Kresliteľnéje kresliť () hlavička metódy.

Výpis 4 predstavuje druhý príklad: a Obdĺžnik triedy, ktorá tiež implementuje Kresliteľné.

Zoznam 4. Implementácia kresliteľného rozhrania v kontexte obdĺžnika

trieda Obdĺžnikové náradie Drawable {private double x1, y1, x2, y2; Obdĺžnik (dvojitý x1, dvojitý y1, dvojitý x2, dvojitý y2) {this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; } @Override public void draw (int color) {System.out.println ("Obdĺžnik nakreslený s ľavým horným rohom v („ + x1 + ",„ + y1 + ")) a pravým dolným rohom v („ + x2 + "," + y2 + ") a farba" + farba); } dvojité getX1 () {návrat x1; } dvojité getX2 () {návrat x2; } dvojnásobok getY1 () {návrat y1; } dvojnásobok getY2 () {návrat y2; }}

Zoznam 4 Obdĺžnik trieda popisuje obdĺžnik ako dvojicu bodov označujúcich ľavý horný a pravý dolný roh tohto tvaru. Ako s Kruh, Obdĺžnik poskytuje konštruktor a vhodné metódy getra a tiež implementuje Kresliteľné rozhranie.

Prepísanie hlavičiek metódy rozhrania

Kompilátor nahlási chybu pri pokuse o kompiláciu iného akoabstraktné trieda, ktorá obsahuje náradie doložka o rozhraní, ale neprepíše všetky hlavičky metód rozhrania.

Dátové hodnoty typu rozhrania sú objekty, ktorých triedy implementujú rozhranie a ktorých správanie je uvedené v hlavičkách metód rozhrania. Táto skutočnosť naznačuje, že môžete priradiť odkaz na objekt k premennej typu rozhrania za predpokladu, že trieda objektu implementuje rozhranie. Zoznam 5 ukazuje.

Zoznam 5. Aliasing Circle and Rectangle objects as Drawables

trieda 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)}; pre (int i = 0; i <drawables.length; i ++) drawables [i] .draw (Drawable.RED); }}

Pretože Kruh a Obdĺžnik realizovať Kresliteľné, Kruh a Obdĺžnik predmety majú Kresliteľné typu okrem svojich triednych typov. Preto je zákonné ukladať odkazy na každý objekt v poli Kresliteľnés. Smyčka iteruje cez toto pole a vyvolá každé z nich Kresliteľné objektu kresliť () metóda na nakreslenie kruhu alebo obdĺžnika.

Za predpokladu, že zoznam 2 je uložený v a Drawable.java zdrojový súbor, ktorý je v rovnakom adresári ako Circle.java, Obdĺžnik.javaa Draw.java zdrojové súbory (ktoré ukladajú položky 3, 4 a 5), ​​kompilujte tieto zdrojové súbory pomocou niektorého z nasledujúcich príkazových riadkov:

javac Draw.java javac * .java

Spustiť Nakreslite žiadosť takto:

java Draw

Mali by ste dodržiavať nasledujúci výstup:

Kruh nakreslený na (10.0, 20.0), s polomerom 15,0 a farbou 1 Kruh nakreslený na (30.0, 20.0), s polomerom 10,0 a farbou 1 Obdĺžnik nakreslený s ľavým horným rohom na (5,0, 8,0) a pravým dolným rohom pri (8,0, 9,0) a farba 1

Rovnaký výstup môžete vygenerovať aj zadaním nasledujúcich údajov hlavný() metóda:

public static void main (String [] args) {Circle c = new Circle (10, 20, 15); c.draw (Drawable.RED); c = nový kruh (30, 20, 10); c.draw (Drawable.RED); Obdĺžnik r = nový Obdĺžnik (5, 8, 8, 9); r.draw (Drawable.RED); }

Ako vidíte, je namáhavé opakovane vyvolávať objekty každého z nich kresliť () metóda. Týmto spôsobom sa do kódu pridá ďalší bajtkód Nakreslitetriedny súbor. Myslením na Kruh a Obdĺžnik ako Kresliteľnés, môžete na zjednodušenie kódu využiť pole a jednoduchú slučku. Toto je ďalšia výhoda navrhovania kódu, ktorý uprednostňuje rozhrania pred triedami.

Pozor!

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