Pokud jste četli moje Java 101 tutoriál představující statické třídy a vnitřní třídy, měli byste znát základy práce s vnořenými třídami v kódu Java. V tomto tipu pro Java se naučíte tři běžné způsoby, jak používat techniky vnoření s rozhraními Java. Stručně také předvedu vnořovací rozhraní se statickými metodami, známými také jako rozhraní statických metod.
Více informací o rozhraních Java
Úvod do rozhraní Java, včetně rozdílu mezi třídami a rozhraními, viz moje Java 101 tutoriál Práce s rozhraními v Javě.
Vnoření rozhraní ve třídách
Java umožňuje deklarovat rozhraní uvnitř tříd. Po deklaraci je rozhraní automaticky statickým členem třídy. Není třeba deklarovat rozhraní s statický
klíčové slovo. Zvažte následující příklad:
třída EnclosingClass {rozhraní EnclosedInterface1 {} statické rozhraní EnclosedInterface2 {}}
Uzavřené rozhraní 1
a Uzavřené rozhraní2
jsou statické členské rozhraní. Neexistuje ekvivalent místních tříd, protože rozhraní nelze deklarovat v blocích. Rozhraní však lze použít v anonymních kontextech tříd.
Vnořená rozhraní nejsou obvykle přístupná za rámec jejich uzavírajících tříd. Jinak je můžete deklarovat jako rozhraní nejvyšší úrovně. Místo toho k nim přistupujete zevnitř jejich obklopujících tříd, jak je ukázáno zde:
třída EnclosingClass {interface EnclosedInterface1 {} statické rozhraní EnclosedInterface2 {} statická třída EnclosedClass1 implementuje EnclosedInterface1, EnclosedInterface2 {} třída EnclosedClass2 implementuje EnclosedInterface1, EnclosedInterface2 {} void m () {třída EnclosedClass3 implementuje EnclosedClass3 implementuje EnclosedClass3 }}
Všimněte si, že statická třída členů EnclosedClass1
, nestatická třída členů EnclosedClass2
a místní třída Třída Enclosed3
implementovat obě vnořená rozhraní. V kontextu anonymní třídy však lze implementovat pouze jedno rozhraní. (Další informace o anonymních třídách najdete v statických třídách a vnitřních třídách v Javě.)
Třídy s vnořenými rozhraními v java.net
Standardní knihovna tříd Java obsahuje třídy s vnořenými rozhraními. Například, InetAddress
(v java.net
balíček), který představuje adresu internetového protokolu, prohlašuje za soukromou Adresy
rozhraní, které je implementováno soukromě Adresy v mezipaměti
a NameServiceAddresses
statické členské třídy. Rovněž prohlašuje, že je soukromé NameService
rozhraní, které je implementováno soukromě Služba PlatformNameService
a HostsFileNameService
statické členské třídy.
Vnoření rozhraní do rozhraní
Java také umožňuje deklarovat rozhraní uvnitř rozhraní. V tomto případě je vnořené rozhraní statickým členem jeho obklopujícího rozhraní a ještě jednou statický
klíčové slovo je nadbytečné. Vnořené rozhraní je také implicitně veřejné. Zde je příklad:
rozhraní EnclosingInterface {rozhraní EnclosedInterface1 // implicitně statické a veřejné {} statické rozhraní EnclosedInterface2 // výslovně statické a implicitně veřejné {}}
Přístup k uzavřenému rozhraní získáte předponou názvu názvu a operátoru přístupu členů. Například uveďte EnclosingInterface.EnclosedInterface1
mít přístup Uzavřené rozhraní 1
.
Vnořená rozhraní v prostředí Java Collections Framework
Rámec kolekce Java poskytuje přehled o užitečnosti vnoření jednoho rozhraní do jiného. Zvažte java.util.Map
rozhraní, které popisuje a mapa (kolekce párů klíč – hodnota). The Mapa
rozhraní abstrahuje, co to znamená být mapou. Třídy jako HashMap
a java.util.TreeMap
nářadí Mapa
, popisující různé druhy implementací map.
Mapa
prohlašuje Vstup
jako jeden z jejích členů. Vstup
je vnořené rozhraní, které popisuje pár klíč – hodnota. The Vstup
rozhraní je deklarováno v Mapa
z důvodu úzkého vztahu mezi těmito dvěma rozhraními - každá položka musí patřit do mapy. Vstup
je implementován java.util.AbstractMap
třídy SimpleEntry
a SimpleImmutableEntry
statické členské třídy. Tyto statické členské třídy budete obvykle ignorovat a komunikovat s nimi Mapa. Vstup
namísto.
Vnoření tříd do rozhraní
Jednou z funkcí cizího jazyka Java je schopnost vnořit třídu do rozhraní. Stejně jako u vnořeného rozhraní je vnořená třída implicitně veřejná a statická. Zde je příklad:
rozhraní EnclosingInterface {třída EnclosedClass {}}
Navzdory své podivnosti může být schopnost vnořit třídu uvnitř rozhraní užitečná, zvláště když existuje těsný vztah mezi uzavřeným rozhraním a uzavřenou třídou. Zachycení tohoto vztahu zlepšuje čitelnost zdrojového kódu. V případech, kdy třída a rozhraní nesou stejný název, vnoření vám také pomůže vyhnout se konfliktu názvů mezi těmito dvěma.
Příklad: Adresovatelné rozhraní zahrnuje třídu adres
Předpokládejme, že chcete modelovat adresovatelné entity, jako jsou dopisy, pohlednice a balíky. Každá entita bude popsána svou vlastní třídou, ale všechny sdílejí společné rysy adresovatelnosti k určitému cíli. Každá třída může být navržena s duplicitními adresními poli, nebo můžete tyto podrobnosti abstrahovat do společné nadtřídy. Případně můžete využít seznam 1 Adresovatelné
rozhraní.
Výpis 1. Addressable.java
veřejné rozhraní Adresovatelné {public class Address {private String boxNumber; soukromá ulice String; soukromé město String; veřejná adresa (String boxNumber, String street, String city) {this.boxNumber = boxNumber; this.street = ulice; this.city = city; } public String getBoxNumber () {return boxNumber; } public String getStreet () {zpáteční ulice; } public String getCity () {návratové město; } public String toString () {return boxNumber + "-" + street + "-" + city; }} veřejná adresa getAddress (); }
The Adresovatelné
rozhraní popisuje adresovatelnou entitu jako obsahující adresu. Tuto adresu popisuje vnořený Adresa
třída. The getAddress ()
metoda je implementována jakoukoli implementací třídy Adresovatelné
.
Výpis 2 představuje zdrojový kód pro a Dopis
třída, která implementuje Adresovatelné
.
Výpis 2. Letter.java
veřejná třída Letter implementuje Addressable {private Addressable.Address address; public Letter (String boxNumber, String street, String city) {address = new Addressable.Address (boxNumber, street, city); } public Address getAddress () {zpáteční adresa; }}
Dopis
ukládá jeden adresa
pole typu Adresovatelné. Adresa
. Tato vnořená třída je vytvořena pomocí Dopis
konstruktor. Implementováno getAddress ()
metoda vrátí tento objekt.
Nyní zvažte, co se stane, když přidáme Pohlednice
a Balíček
třídy do Adresáře
aplikace. Výpis 3 představuje zdrojový kód souboru Adresáře
aplikace, která předvádí Pohlednice
, Balíček
, a Dopis
typy.
Výpis 3. Addressables.java
veřejné třídy Adresáře {public static void main (String [] args) {Addressable [] addressables = {new Letter ("100", "Main Street", "Town A"), new Postcard ("200", "Waterfront Drive" , „Město B“), nový balíček („300“, „10. Ave“, „Město C“)}; for (int i = 0; i <addressables.length; i ++) System.out.println (addressables [i] .getAddress ()); }}
The hlavní()
metoda nejprve vytvoří pole Adresovatelné
předměty. Poté iteruje nad těmito objekty a vyvolává getAddress ()
na každém objektu. Vrátil se Adresovatelné. Adresa
objektu toString ()
metoda je vyvolána System.out.println ()
vrátit řetězcovou reprezentaci objektu a tato reprezentace se následně odešle.
Zkompilujte výpisy 2 a 3 spolu s Postcard.java
a Parcel.java
jak následuje:
javac * .java
Spusťte aplikaci následujícím způsobem:
java adresáře
Měli byste dodržovat následující výstup:
100 - Main Street - Town A 200 - Waterfront Drive - Town B 300 - 10th Ave - Town C
Vnořená rozhraní se statickými metodami (rozhraní statických metod)
Mnoho vývojářů věří, že vnoření třídy do rozhraní porušuje objektově orientované programování a účel rozhraní. Je však dobré vědět o této schopnosti, protože se s ní můžete setkat při údržbě kódu někoho jiného. Nyní, když se rozhraní vyvinula tak, aby zahrnovala výchozí a statické metody, můžete narazit na další důvody pro vnoření třídy do rozhraní. Jako příklad je zde místní třída vnořená do rozhraní statické metody:
rozhraní I {static void m () {třída C {}}}
Závěr
Představil jsem tři běžné způsoby použití technik vnoření s třídami a rozhraními Java a také jsem demonstroval kontroverzní techniku vnoření rozhraní se statickými metodami. Podívejte se na kompletní Java 101 tutoriál, kde se dozvíte více o vnoření se statickými třídami a vnitřními třídami v Javě.
Tento příběh „Hnízdění s rozhraními Java“ původně publikoval server JavaWorld.