Programování

Vnoření do rozhraní Java

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ů EnclosedClass2a 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í Dopiskonstruktor. 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.

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