Ak ste čítali moje Java 101 tutoriál zavádzajúci statické triedy a vnútorné triedy, mali by ste byť oboznámení so základmi práce s vnorenými triedami v kóde Java. V tomto tipe pre Java sa dozviete tri bežné spôsoby, ako používať techniky vnorenia s rozhraniami Java. Stručne tiež ukážem vnorené rozhrania pomocou statických metód, známych aj ako rozhrania statických metód.
Viac informácií o rozhraniach Java
Úvod do rozhraní Java, vrátane rozdielov medzi triedami a rozhraniami, nájdete na mojej webovej stránke Java 101 tutorial Práca s rozhraniami v Jave.
Vnorené rozhrania v triedach
Java vám umožňuje deklarovať rozhrania vo vnútri tried. Po deklarácii je rozhranie automaticky statickým členom triedy. Nie je potrebné deklarovať rozhranie s statický
kľúčové slovo. Uvažujme o nasledujúcom príklade:
trieda EnclosingClass {rozhranie EnclosedInterface1 {} statické rozhranie EnclosedInterface2 {}}
Uzavreté rozhranie1
a Uzavreté rozhranie2
sú statické členské rozhrania. Neexistuje ekvivalent miestnych tried, pretože rozhrania nemožno deklarovať v blokoch. Rozhrania sa však dajú použiť v anonymných kontextoch triedy.
Na vnorené rozhrania sa zvyčajne nepristupuje nad rámec ich priložených tried. Inak by ste ich mohli vyhlásiť za rozhrania najvyššej úrovne. Namiesto toho sú prístupné z vnútra svojich priložených tried, ako je to demonštrované tu:
trieda EnclosingClass {interface EnclosedInterface1 {} statické rozhranie EnclosedInterface2 {} statická trieda EnclosedClass1 implementuje EnclosedInterface1, EnclosedInterface2 {} trieda EnclosedClass2 implementuje EnclosedInterface1, EnclosedInterface2 {} void m () {trieda EnclosedClass3 implementuje EnclosedClass3 implementuje EnclosedClass3 }}
Všimnite si, že statická trieda členov Uzavretá trieda1
, nestatická trieda členov EnclosedClass2
a miestna trieda Uzavretá trieda3
implementovať obe vnorené rozhrania. V kontexte anonymnej triedy je však možné implementovať iba jedno rozhranie. (Viac anonymných tried nájdete v časti Statické triedy a vnútorné triedy v Jave.)
Triedy s vnorenými rozhraniami v java.net
Štandardná knižnica tried Java obsahuje triedy s vnorenými rozhraniami. Napríklad, InetAddress
(v java.net
balíček), ktorý predstavuje adresu internetového protokolu, vyhlasuje za súkromnú Adresy
rozhranie, ktoré je implementované súkromne CachedAddresses
a NameServiceAddresses
triedy statických členov. Deklaruje tiež súkromie NameService
rozhranie, ktoré je implementované súkromne Služba PlatformNameService
a HostsFileNameService
triedy statických členov.
Vnorené rozhrania do rozhraní
Java vám tiež umožňuje deklarovať rozhrania vnútri rozhraní. V tomto prípade je vnorené rozhranie statickým členom jeho obklopujúceho rozhrania a ešte raz statický
kľúčové slovo je nadbytočné. Vnorené rozhranie je tiež implicitne verejné. Tu je príklad:
rozhranie EnclosingInterface {rozhranie EnclosedInterface1 // implicitne statické a verejné {} statické rozhranie EnclosedInterface2 // výslovne statické a implicitne verejné {}}
K uzavretému rozhraniu sa dostanete tak, že pred jeho menom zadáte názov a operátor prístupu členov. Napríklad uveďte EnclosingInterface.EnclosedInterface1
pristúpiť Uzavreté rozhranie1
.
Vnorené rozhrania v rámci Java Collections Framework
Rámec kolekcie Java poskytuje prehľad o užitočnosti vnorenia jedného rozhrania do druhého. Zvážte java.util.Map
rozhranie, ktoré popisuje a mapa (zbierka párov kľúč - hodnota). The Mapa
rozhranie abstraktní, čo to znamená byť mapou. Triedy ako napr HashMap
a java.util.TreeMap
realizovať Mapa
, popisujúci rôzne druhy implementácií máp.
Mapa
vyhlasuje Vstup
ako jeden z jej členov. Vstup
je vnorené rozhranie, ktoré popisuje pár kľúč - hodnota. The Vstup
rozhranie je deklarované v Mapa
kvôli úzkemu vzťahu medzi týmito dvoma rozhraniami - každý záznam musí patriť do mapy. Vstup
je implementovaná java.util.AbstractMap
triedy SimpleEntry
a SimpleImmutableEntry
statické členské triedy. Tieto statické triedy členov budete zvyčajne ignorovať a budete s nimi komunikovať Mapa. Vstup
namiesto toho.
Vnorenie tried do rozhraní
Jednou z funkcií cudzieho jazyka Java je schopnosť vnoriť triedu do rozhrania. Rovnako ako vnorené rozhranie, vnorená trieda je implicitne verejná a statická. Tu je príklad:
rozhranie EnclosingInterface {trieda EnclosedClass {}}
Napriek svojej podivnosti môže byť schopnosť vnoriť triedu do rozhrania užitočná, najmä ak existuje úzky vzťah medzi priloženým rozhraním a priloženou triedou. Zachytenie tohto vzťahu zlepšuje čitateľnosť zdrojového kódu. V prípadoch, keď má trieda a rozhranie rovnaký názov, vnorenie vám tiež môže pomôcť vyhnúť sa konfliktu názvov medzi týmito dvoma názvami.
Príklad: Adresovateľné rozhranie obsahuje triedu adries
Predpokladajme, že chcete modelovať adresovateľné entity, ako sú listy, pohľadnice a balíky. Každá entita bude popísaná svojou vlastnou triedou, ale všetky majú spoločné to, že sú adresovateľné k určitému cieľu. Každá trieda môže byť navrhnutá s duplicitnými poľami adresy, alebo môžete tieto podrobnosti abstraktne vytvoriť do spoločnej nadtriedy. Prípadne môžete využiť zoznam 1 Adresovateľné
rozhranie.
Zoznam 1. Addressable.java
verejné rozhranie Adresovateľné {public class Address {private String boxNumber; súkromná ulica String; súkromné mesto String; verejná adresa (String boxNumber, String street, String city) {this.boxNumber = boxNumber; this.street = ulica; this.city = mesto; } public String getBoxNumber () {return boxNumber; } public String getStreet () {spiatočná ulica; } public String getCity () {návratové mesto; } public String toString () {return boxNumber + "-" + ulica + "-" + mesto; }} verejna adresa getAddress (); }
The Adresovateľné
rozhranie popisuje adresovateľnú entitu ako obsahujúcu adresu. Táto adresa je opísaná vnoreným Adresa
trieda. The getAddress ()
metóda je implementovaná čímkoľvek, čo trieda implementuje Adresovateľné
.
Výpis 2 predstavuje zdrojový kód a List
triedy, ktorá implementuje Adresovateľné
.
Výpis 2. Letter.java
verejná trieda Letter implementuje Addressable {private Addressable.Address address; verejné písmeno (String boxNumber, String street, String city) {address = new Addressable.Address (boxNumber, street, city); } public Address getAddress () {spiatočná adresa; }}
List
ukladá singel adresa
pole typu Adresovateľné. Adresa
. Túto vnorenú triedu vytvára inštancia List
konštruktér. Vykonané getAddress ()
metóda vráti tento objekt.
Teraz zvážte, čo sa stane, keď pridáme Pohľadnica
a Pozemok
triedy do Adresáre
žiadosť. Výpis 3 predstavuje zdrojový kód súboru Adresáre
žiadosť, ktorá demonštruje Pohľadnica
, Pozemok
a List
typy.
Zoznam 3. Addressables.java
verejná trieda Adresáre {public static void main (String [] args) {Addressable [] addressables = {new Letter ("100", "Main Street", "Town A"), new Postcard ("200", "Waterfront Drive" , „Mesto B“), nový balík („300“, „10. ul.“, „Mesto C“)}; for (int i = 0; i <addressables.length; i ++) System.out.println (addressables [i] .getAddress ()); }}
The hlavný()
metóda najskôr vytvorí pole Adresovateľné
predmety. Potom sa vznáša nad týmito objektmi getAddress ()
na každom objekte. Vrátený Adresovateľné. Adresa
objektu natiahnuť()
metóda je vyvolaná System.out.println ()
vráti reťazcovú reprezentáciu objektu a táto reprezentácia sa následne vydá.
Zostavte výpisy 2 a 3 spolu s Postcard.java
a Parcel.java
nasledovne:
javac * .java
Spustite aplikáciu nasledovne:
java adresáre
Mali by ste dodržiavať nasledujúci výstup:
100 - Hlavná ulica - Mesto A 200 - Nábrežie - Mesto B 300 - 10. ulica - Mesto C
Vnorené rozhrania so statickými metódami (rozhrania statických metód)
Mnoho vývojárov sa domnieva, že vnorenie triedy do rozhrania porušuje objektovo orientované programovanie a účel rozhrania. Je však dobré o tejto funkcii vedieť, pretože sa s ňou môžete stretnúť pri údržbe kódu niekoho iného. Ďalej, teraz, keď sa rozhrania vyvinuli tak, aby zahŕňali predvolené a statické metódy, môžete naraziť na ďalšie dôvody na vnorenie triedy do rozhrania. Ako príklad uvádzame lokálnu triedu vnorenú do rozhrania statickej metódy:
rozhranie I {static void m () {trieda C {}}}
Záver
Predstavil som tri bežné spôsoby použitia techník vnorenia s triedami a rozhraniami Java a tiež som demonštroval kontroverznú techniku vnorenia rozhraní so statickými metódami. Zobraziť kompletné Java 101 tutoriál, kde sa dozviete viac o vnorení so statickými triedami a vnútornými triedami v Jave.
Tento príbeh „Hniezdenie s rozhraniami Java“ pôvodne publikoval server JavaWorld.