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 2
ja 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 Kirje
rakentaja. 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
, Paketti
ja 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.