Ohjelmointi

Pesiminen Java-käyttöliittymillä

Jos olet lukenut minun Java 101 staattisten luokkien ja sisäisten luokkien esittely, sinun tulisi tuntea Java-koodissa olevien sisäkkäisten luokkien kanssa työskentelemisen perusteet. Tässä Java-vinkissä opit kolme yleistä tapaa käyttää pesitystekniikoita Java-käyttöliittymien kanssa. Esittelen myös lyhyesti pesimärajapinnat staattisten menetelmien kanssa, jotka tunnetaan myös nimellä staattisten menetelmien rajapinnat.

Lisätietoja Java-käyttöliittymistä

Johdanto Java-rajapintoihin, mukaan lukien luokkien ja rajapintojen ero, on minun Java 101 opetusohjelma Käyttö Java-käyttöliittymien kanssa.

Rajapintojen pesiminen luokissa

Java antaa sinun ilmoittaa rajapinnat luokkien sisällä. Kun liitäntä on ilmoitettu, se on automaattisesti luokan staattinen jäsen. Käyttöliittymää ei tarvitse ilmoittaa staattinen avainsana. Harkitse seuraavaa esimerkkiä:

 class EnclosingClass {interface EnclosedInterface1 {} staattinen käyttöliittymä EnclosedInterface2 {}} 

Suljettu liitäntä 1 ja Suljettu liitäntä 2 ovat staattiset jäsenrajapinnat. Paikallisille luokille ei ole vastaavaa, koska rajapintoja ei voida ilmoittaa lohkoina. Rajapintoja voidaan kuitenkin käyttää nimettömissä luokkaympäristöissä.

Sisäkkäisiä rajapintoja ei yleensä käytetä niiden sulkevien luokkien ulkopuolelta. Muuten voit julistaa heidät ylätason rajapinnat. Sen sijaan heihin pääsee sulkeutuvien luokkiensa sisäpuolelta, kuten täällä osoitetaan:

 class EnclosingClass {interface EnclosedInterface1 {} staattinen käyttöliittymä EnclosedInterface2 {} staattinen luokka EnclosedClass1 toteuttaa EnclosedInterface1, EnclosedInterface2 {}} Class EnclosedClass2 toteuttaa EnclosedInterface1, EnclosedInterface2 {} void m () {class EnclosedInassface {luokka EnclosedClass3 impl { }} 

Huomaa, että staattinen jäsenluokka Suljettu luokka 1, ei-staattinen jäsenluokka Suljettu luokka 2ja paikallinen luokka Suljettu luokka 3 toteuttaa molemmat sisäkkäiset käyttöliittymät. Vain yksi käyttöliittymä voidaan kuitenkin toteuttaa nimettömässä luokan yhteydessä. (Katso lisätietoja staattisista luokista ja sisäisistä luokista Javassa anonyymien luokkien suhteen.)

Luokat, joissa on sisäkkäiset käyttöliittymät java.netissä

Javan vakioluokkikirjasto sisältää luokat sisäkkäisillä rajapinnoilla. Esimerkiksi, InetAddress ( java.net paketti), joka edustaa Internet-protokollan osoitetta, ilmoittaa yksityisen Osoitteet käyttöliittymä, jonka yksityinen toteuttaa Välimuistissa olevat osoitteet ja NameServiceAddresses staattiset jäsenluokat. Se julistaa myös yksityisen NimiPalvelu käyttöliittymä, jonka yksityinen toteuttaa PlatformNameService ja HostsFileNameService staattiset jäsenluokat.

Liitäntöjen sijoittaminen rajapintoihin

Java antaa sinun myös ilmoittaa käyttöliittymät rajapintojen sisällä. Tässä tapauksessa sisäkkäinen käyttöliittymä on sen sulkevan käyttöliittymän staattinen jäsen ja jälleen kerran staattinen avainsana on tarpeeton. Sisäkkäinen käyttöliittymä on myös implisiittisesti julkinen. Tässä on esimerkki:

 käyttöliittymä EnclosingInterface {interface EnclosedInterface1 // implisiittisesti staattinen ja julkinen {} staattinen rajapinta EnclosedInterface2 // eksplisiittisesti staattinen ja implisiittisesti julkinen {}} 

Voit käyttää suljettua käyttöliittymää etuliittämällä sen nimen liitettävän käyttöliittymän nimeen ja jäsenen käyttöoperaattoriin. Määritä esimerkiksi EnclosingInterface.EnclosedInterface 1 pääsyyn Suljettu liitäntä 1.

Sisäkkäiset käyttöliittymät Java Collections Frameworkissa

Java Collections Framework tarjoaa käsityksen yhden käyttöliittymän sijoittamisesta toiseen. Harkitse java.util.Kartta käyttöliittymä, joka kuvaa a kartta (kokoelma avainarvopareja). Kartta käyttöliittymä tiivistää, mitä tarkoittaa olla kartta. Luokat kuten HashMap ja java.util.TreeMap toteuttaa Kartta, joka kuvaa erilaisia ​​karttatoteutuksia.

Kartta julistaa Entry yhtenä sen jäsenistä. Entry on sisäkkäinen käyttöliittymä, joka kuvaa avain-arvo-paria. Entry käyttöliittymä on ilmoitettu Kartta näiden kahden rajapinnan läheisen suhteen takia - jokaisen merkinnän on kuuluttava karttaan. Entry toteuttaa java.util.AbstractKartta luokan SimpleEntry ja SimpleImmutableEntry staattiset jäsenluokat. Ohitat nämä staattiset jäsenluokat yleensä ja olet vuorovaikutuksessa heidän kanssaan Kartta sen sijaan.

Luokkien pesiminen rajapinnoissa

Yksi Java: n vieraista kieliominaisuuksista on kyky sijoittaa luokka käyttöliittymän sisälle. Kuten sisäkkäisen käyttöliittymän kohdalla, sisäkkäinen luokka on implisiittisesti julkinen ja staattinen. Tässä on esimerkki:

 käyttöliittymä EnclosingInterface {class EnclosedClass {}} 

Omituisuudestaan ​​huolimatta luokan pesiminen liittymän sisällä voi olla hyödyllistä, varsinkin kun sulkevan rajapinnan ja suljetun luokan välillä on tiukka suhde. Tämän suhteen kaappaaminen parantaa lähdekoodin luettavuutta. Tapauksissa, joissa luokassa ja käyttöliittymässä on sama nimi, pesiminen voi myös auttaa välttämään nimiristiriitaa näiden kahden välillä.

Esimerkki: Osoitettava käyttöliittymä sulkee osoiteluokan

Oletetaan, että haluat mallintaa osoitettavat kohteet, kuten kirjeet, postikortit ja paketit. Kukin entiteetti kuvataan omalla luokallaan, mutta niillä kaikilla on yhteistä oleminen osoitettavissa johonkin määränpäähän. Jokainen luokka voidaan suunnitella kahdella osoitekentällä, tai voit tiivistää nämä yksityiskohdat yhteiseksi superluokaksi. Vaihtoehtoisesti voit hyödyntää Listing 1: tä Osoitettavissa käyttöliittymä.

Listaus 1. Addressable.java

 julkinen käyttöliittymä Osoitettava {public class Address {private String boxNumber; yksityinen String-katu; yksityinen String kaupunki; julkinen osoite (String boxNumber, String street, String city) {this.boxNumber = boxNumber; tämä.katu = katu; this.city = kaupunki; } public String getBoxNumber () {return boxNumber; } public String getStreet () {paluukatu; } public String getCity () {paluukaupunki; } public String toString () {return boxNumber + "-" + katu + "-" + kaupunki; }} julkinen osoite getAddress (); } 

Osoitettavissa käyttöliittymä kuvaa osoitettavan yksikön sisältävän osoitteen. Sisäkkäiset kuvaavat tämän osoitteen Osoite luokassa. getAddress () menetelmä toteutetaan minkä tahansa luokan toteuttajan kanssa Osoitettavissa.

Listaus 2 esittää lähdekoodin a Kirje luokka, joka toteuttaa Osoitettavissa.

Listaus 2. Letter.java

 julkinen luokka Kirje toteuttaa osoitettava {yksityinen osoitettava.osoiteosoite; public Letter (String boxNumber, String street, String city) {address = new Addressable.Address (laatikkonumero, katu, kaupunki); } public address getAddress () {paluuosoite; }} 

Kirje tallentaa yhden osoite tyypin kenttä Osoiteosoite. Tämän sisäkkäisen luokan on havainnollistanut Kirjerakentaja. Toteutettu getAddress () method palauttaa tämän objektin.

Mieti nyt, mitä tapahtuu, kun lisäämme Postikortti ja Paketti luokkiin Osoitettavat sovellus. Listaus 3 näyttää lähdekoodin Osoitettavat sovellus, joka osoittaa Postikortti, Pakettija Kirje tyypit.

Listaus 3. Addressables.java

 public class Addressables {public static void main (String [] args) {Addressable [] addressables = {new Letter ("100", "Main Street", "Town A"), new Postcard ("200", "Waterfront Drive") , "Kaupunki B"), uusi paketti ("300", "10th Ave", "kaupunki C")}; for (int i = 0; i <osoitettavien.pituus; i ++) System.out.println (osoitettavat [i] .getAddress ()); }}

main () method luo ensin taulukon Osoitettavissa esineitä. Sitten se toistaa nämä esineet vedoten getAddress () jokaisessa objektissa. Palasi Osoite. Osoite esine toString () menetelmää käyttää System.out.println () palauttaa objektin merkkijonoesityksen, ja tämä esitys tulostetaan myöhemmin.

Laadi listat 2 ja 3 yhdessä Postikortti.java ja Paketti.java seuraavasti:

 javac * .java 

Suorita sovellus seuraavasti:

 java Osoitteet 

Ota huomioon seuraava tulos:

 100 - Main Street - Kaupunki A 200 - Waterfront Drive - Kaupunki B 300 - 10. Ave - Kaupunki C. 

Sisäkkäiset rajapinnat staattisten menetelmien kanssa (staattiset menetelmärajapinnat)

Monet kehittäjät uskovat, että luokan pesiminen käyttöliittymässä rikkoo olio-ohjelmointia ja käyttöliittymän tarkoitusta. On kuitenkin hyvä tietää tästä ominaisuudesta, koska saatat kohdata sen ylläpidettäessä jonkun toisen koodia. Lisäksi nyt, kun rajapinnat ovat kehittyneet sisällyttämään oletus- ja staattiset menetelmät, saatat kohdata muita syitä luokan sijoittamiseen käyttöliittymään. Esimerkkinä tässä on paikallinen luokka, joka on sisäkkäin staattisessa menetelmärajapinnassa:

 käyttöliittymä I {staattinen void m () {luokka C {}}} 

Johtopäätös

Olen esittänyt kolme yleistä tapaa käyttää pesitystekniikoita Java-luokkien ja -rajapintojen kanssa ja osoittanut myös kiistanalainen tekniikka liittymien pesimisestä staattisilla menetelmillä. Katso täydellinen Java 101 opetusohjelma saadaksesi lisätietoja Java-staattisten luokkien ja sisäisten luokkien pesimisestä.

Tämän tarinan "Nesting with Java interface" julkaisi alun perin JavaWorld.

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