Ohjelmointi

Paketit ja staattinen tuonti Java-kielellä

Edellisessäni Java 101 opetusohjelma, opit organisoimaan koodisi paremmin ilmoittamalla viitetyypit (tunnetaan myös luokkina ja rajapinnoina) muiden viitetyyppien ja lohkojen jäseninä. Esitin myös, kuinka voit käyttää sisäkkäisyyttä, jotta vältetään nimiristiriidat sisäkkäisten viitetyyppien ja ylätason viitetyyppien välillä, joilla on sama nimi.

Pesimisen ohella Java käyttää paketteja samannimisten ongelmien ratkaisemiseen ylätason viitetyypeissä. Staattisen tuonnin käyttö yksinkertaistaa myös staattisten jäsenten käyttöä pakatuissa ylätason viitetyypeissä. Staattinen tuonti säästää näppäinpainalluksia, kun käytät näitä jäseniä koodissasi, mutta on muutamia asioita, joita on syytä varoa, kun käytät niitä. Tässä opetusohjelmassa esitän sinut pakettien ja staattisen tuonnin käyttämisestä Java-ohjelmissasi.

lataa Hae koodi Lataa lähdekoodi esimerkiksi sovelluksiin tässä Java-opetusohjelmassa. Luonut Jeff Friesen JavaWorldille.

Pakkauksen viitetyypit

Java-kehittäjät ryhmittelevät niihin liittyvät luokat ja rajapinnat paketteihin. Pakettien käyttö helpottaa viitetyyppien löytämistä ja käyttöä, välttää nimiristiriitoja samannimisten tyyppien välillä ja hallita tyyppien käyttöä.

Tässä osassa opit paketeista. Löydät paketit, tutustu paketti ja tuonti lauseita ja tutustu suojattujen käyttöoikeuksien, JAR-tiedostojen ja tyyppihakujen aiheisiin.

Mitä Java-paketit ovat?

Ohjelmistokehityksessä järjestämme tavallisesti kohteet niiden hierarkkisten suhteiden mukaan. Esimerkiksi edellisessä opetusohjelmassa esitin sinulle, kuinka ilmoitetaan luokat muiden luokkien jäseniksi. Voimme käyttää tiedostojärjestelmiä myös hakemistojen pesimiseen muihin hakemistoihin.

Näiden hierarkkisten rakenteiden käyttäminen auttaa välttämään nimiristiriitoja. Esimerkiksi ei-hierarkkisessa tiedostojärjestelmässä (yksi hakemisto) ei ole mahdollista määrittää samaa nimeä useille tiedostoille. Sitä vastoin hierarkkinen tiedostojärjestelmä antaa saman nimisten tiedostojen olla olemassa eri hakemistoissa. Vastaavasti kaksi liitettävää luokkaa voi sisältää saman nimisiä sisäkkäisiä luokkia. Nimiristiriitoja ei ole, koska kohteet on jaettu eri nimitiloihin.

Java antaa meille mahdollisuuden myös jakaa ylätason (ei sisäkkäiset) viitetyypit useisiin nimitiloihin, jotta voimme järjestää nämä tyypit paremmin ja estää nimiristiriidat. Java: ssa pakettikieliominaisuutta käytetään jakamaan ylätason viitetyypit useisiin nimitiloihin. Tässä tapauksessa a paketti on ainutlaatuinen nimitila viitetyyppien tallentamiseen. Paketit voivat tallentaa luokkia ja rajapintoja alipaketit, jotka ovat paketteja, jotka ovat sisäkkäisiä muissa paketeissa.

Paketilla on nimi, jonka on oltava varaamaton tunniste; esimerkiksi, java. Jäsenkäyttöoperaattori (.) erottaa paketin nimen alipaketin nimestä ja erottaa paketin tai alipaketin nimen tyypin nimestä. Esimerkiksi kahden jäsenen käyttöoperaattorit java.lang.Järjestelmä erillinen paketin nimi java alkaen lang alipaketin nimi ja erillinen paketin nimi lang alkaen Järjestelmä tyypin nimi.

Viitetyypit on ilmoitettava julkinen päästä käsiksi pakettiensa ulkopuolelta. Sama koskee kaikkia vakioita, konstruktoreita, menetelmiä tai sisäkkäisiä tyyppejä, joiden on oltava käytettävissä. Näet esimerkkejä näistä myöhemmin opetusohjelmassa.

Pakettilauseke

Javassa käytämme pakettilauseke luoda paketti. Tämä käsky näkyy lähdetiedoston yläosassa ja tunnistaa paketin, johon lähdetiedostotyypit kuuluvat. Sen on oltava seuraavan syntaksin mukainen:

 paketti tunniste[.tunniste]*; 

Pakettilauseke alkaa varatulla sanalla paketti ja jatkuu tunnisteella, jota valinnaisesti seuraa jaksoittain erotettu tunnisteiden sekvenssi. Puolipiste (;) lopettaa tämän lausunnon.

Ensimmäinen (vasemmanpuoleisin) tunniste nimeää paketin ja jokainen seuraava tunniste alipaketin. Esimerkiksi paketti a.b;, kaikki lähdetiedostossa ilmoitetut tyypit kuuluvat ryhmään b alipaketti a paketti.

Pakettien / alipakettien nimeämiskäytäntö

Sopimuksen mukaan ilmaisemme paketin tai alipaketin nimen pienillä kirjaimilla. Kun nimi koostuu useista sanoista, sinun kannattaa ehkä kirjoittaa isot sanat ensimmäistä lukuun ottamatta; esimerkiksi, pääkirja.

Pakettien nimien sarjan on oltava ainutlaatuinen kääntämisen ongelmien välttämiseksi. Oletetaan esimerkiksi, että luot kaksi erilaista grafiikka ja oletetaan, että kukin grafiikka paketti sisältää a Kolmio luokka eri käyttöliittymällä. Kun Java-kääntäjä kohtaa jotain alla olevaa, sen on varmistettava, että Kolmio (int, int, int, int) rakentaja on olemassa:

 Kolmio t = uusi kolmio (1, 20, 30, 40); 

Kolmion rajoittava laatikko

Ajattele Kolmio konstruktori määrittelemällä rajoittavan laatikon, johon kolmio piirretään. Kaksi ensimmäistä parametria tunnistavat laatikon vasemman yläkulman ja kaksi toista parametria määrittelevät laatikon laajuuden.

Kääntäjä etsii kaikkia käytettävissä olevia paketteja, kunnes se löytää a grafiikka paketti, joka sisältää a Kolmio luokassa. Jos löydetty paketti sisältää sopivan Kolmio luokka a Kolmio (int, int, int, int) rakentaja, kaikki on hyvin. Muuten, jos löydetty Kolmio luokassa ei ole Kolmio (int, int, int, int) konstruktori, kääntäjä ilmoittaa virheestä. (Sanon lisää hakualgoritmista myöhemmin tässä opetusohjelmassa.)

Tämä skenaario kuvaa yksittäisten pakettien nimisekvenssien valinnan tärkeyttä. Yksilöllisen nimisekvenssin valitsemisen tapa on kääntää Internet-verkkotunnuksesi ja käyttää sitä sekvenssin etuliitteenä. Esimerkiksi valitsisin ca. javajeff koska etuliite koska javajeff.ca on verkkotunnukseni nimi. Haluaisin sitten täsmentää ca. javajeff grafiikka. kolmio pääsyyn Kolmio.

Verkkotunnuksen komponentit ja kelvolliset pakettien nimet

Verkkotunnuksen komponentit eivät aina ole kelvollisia pakettien nimiä. Yksi tai useampi komponenttien nimi voi alkaa numerolla (3D.com), sisältävät väliviivan (-) tai muu laiton luonne (ab-z.com) tai olla yksi Java: n varattuista sanoista (short.com). Yleissopimuksen mukaan sinun on lisättävä numero alaviivalla (com.3D), korvaa laiton merkki alaviivalla (com.ab_z) ja lisää varattu sana alaviivalla (com.short_).

Noudata muutamia sääntöjä välttääksesi lisäongelmia pakettilausekkeessa:

  1. Voit ilmoittaa vain yhden pakettilausekkeen lähdetiedostossa.
  2. Et voi edeltää pakettilausetta muilla kuin kommenteilla.

Ensimmäinen sääntö, joka on toisen säännön erityistapaus, on olemassa, koska ei ole järkevää tallentaa viitetyyppiä useisiin paketteihin. Vaikka paketti voi tallentaa useita tyyppejä, tyyppi voi kuulua vain yhteen pakettiin.

Kun lähdetiedosto ei ilmoita pakettilauseketta, lähdetiedoston tyyppien sanotaan kuuluvan nimeämätön paketti. Ei-triviaalit viitetyypit tallennetaan tyypillisesti omiin paketteihinsa ja ne välttävät nimeämätöntä pakettia.

Java-toteutukset yhdistävät pakettien ja alipakettien nimet samannimisiin hakemistoihin. Esimerkiksi toteutus kartoittaisi grafiikka nimettyyn hakemistoon grafiikka. Paketin tapauksessa a. b, ensimmäinen kirje, a kartoitetaan hakemistoon nimeltä a ja b kartoittaisi a b alihakemisto a. Kääntäjä tallentaa pakettityypit toteuttavat luokkatiedostot vastaavaan hakemistoon. Huomaa, että nimeämätön paketti vastaa nykyistä hakemistoa.

Esimerkki: Äänikirjaston pakkaaminen Java-tiedostoon

Käytännön esimerkki on hyödyllinen paketti lausunto. Tässä osassa esitän paketteja äänikirjaston yhteydessä, jonka avulla voit lukea äänitiedostoja ja hankkia äänitietoja. Lyhyesti sanottuna esitän vain luurankoversion kirjastosta.

Äänikirjasto koostuu tällä hetkellä vain kahdesta luokasta: Audio ja WavReader. Audio kuvaa äänileikkeen ja on kirjaston pääluokka. Listaus 1 esittää sen lähdekoodin.

Luettelo 1. Pakettilausesimerkki (Audio.java)

 paketti ca.javajeff.audio; julkinen loppuluokka Audio {private int [] -näytteet; yksityinen int sampleRate; Ääni (int [] näytteet, int sampleRate) {tämä.näytteet = näytteet; this.sampleRate = sampleRate; } public int [] getSamples () {palauta näytteet; } public int getSampleRate () {return sampleRate; } public staattinen ääni newAudio (String-tiedostonimi) {if (tiedostonimi.toLowerCase (). endWith (". wav")) palauttaa WavReader.read (tiedostonimi); muuten palauta null; // ei tuettu formaatti } } 

Käydään läpi Listing 1 vaihe vaiheelta.

  • Audio.java Tiedosto luettelossa 1 tallentaa Audio luokassa. Tämä luettelo alkaa pakettilausekkeella, joka tunnistaa ca. javajeff.audio luokan pakettina.
  • Audio ilmoitetaan julkinen jotta siihen voidaan viitata paketin ulkopuolelta. Lisäksi se on julistettu lopullinen jotta sitä ei voida laajentaa (tarkoittaen alaluokkaa).
  • Audio julistaa yksityinennäytteet ja näytteenottotaajuus kentät äänidatan tallentamiseksi. Nämä kentät alustetaan arvoille, jotka välitetään Audiorakentaja.
  • Audiorakentaja on ilmoitettu paketti-yksityinen (tarkoittaa, että rakentajaa ei ilmoiteta julkinen, yksityinentai suojattu), jotta tätä luokkaa ei voida instantisoida paketin ulkopuolelta.
  • Audio lahjoja getSamples () ja getSampleRate () menetelmät äänileikkeen näytteiden ja näytteenottotaajuuden palauttamiseksi. Jokainen menetelmä ilmoitetaan julkinen jotta se voidaan kutsua ulkopuolelta Audiopaketti.
  • Audio päättyy a julkinen ja staattinenuusiAudio () tehdas menetelmä palauttaa Audio objektia vastaava Tiedoston nimi Perustelu. Jos äänileikettä ei löydy, tyhjä palautetaan.
  • uusiAudio () vertaa Tiedoston nimi: n laajennus .wav (tämä esimerkki tukee vain WAV-ääntä). Jos ne sopivat yhteen, se toteutetaan return WavReader.read (tiedostonimi) palauttaa Audio objekti WAV-pohjaisen äänidatan kanssa.

Listaus 2 kuvaa WavReader.

Listaus 2. WavReader-apulaite (WavReader.java)

 paketti ca.javajeff.audio; final class WavReader {static Audio read (String filename) {// Lue tiedostonimen sisältö ja käsittele se // joukoksi näyte-arvoja ja näytteenottotaajuus // arvo. Jos tiedostoa ei voi lukea, palauta null. // Lyhyyden vuoksi (ja koska en ole vielä keskustellut Javan // tiedoston I / O-sovellusliittymistä), esitän vain luurankokoodin, joka // palauttaa aina ääniobjektin oletusarvoilla. palauta uusi ääni (uusi int [0], 0); }} 

WavReader on tarkoitettu lukemaan WAV-tiedoston sisältö Audio esine. (Luokka on lopulta isompi lisäkursseilla yksityinen kentät ja menetelmät.) Huomaa, että tätä luokkaa ei ole ilmoitettu julkinen, joka tekee WavReader saatavilla Audio mutta ei koodata ca. javajeff.audio paketti. Ajatella WavReader auttajaluokana, jonka ainoa syy olemassaololle on palvella Audio.

Suorita seuraavat vaiheet tämän kirjaston rakentamiseksi:

  1. Valitse sopiva sijainti tiedostojärjestelmässä nykyiseksi hakemistoksi.
  2. Luo ca / javajeff / audio alihakemistohierarkia nykyisessä hakemistossa.
  3. Kopioi ilmoitukset 1 ja 2 tiedostoihin Audio.java ja WavReader.javavastaavasti; ja tallenna nämä tiedostot audio- alihakemisto.
  4. Olettaen, että nykyinen hakemisto sisältää noin alihakemisto, suorita javac ca / ​​javajeff / audio / *. java kääntää kaksi lähdetiedostoa sisään ca / javajeff / audio. Jos kaikki menee hyvin, sinun pitäisi löytää Audio.luokka ja WavReader.class tiedostot audio- alihakemisto. (Vaihtoehtoisesti tässä esimerkissä voit vaihtaa audio- alihakemisto ja suorita javac * .java.)

Nyt kun olet luonut äänikirjaston, haluat käyttää sitä. Pian tarkastelemme pientä Java-sovellusta, joka osoittaa tämän kirjaston. Ensin on opittava tuontilausekkeesta.

Java-tuontilausunto

Kuvittele, että sinun on määritettävä ca. javajeff grafiikka. kolmio jokaisesta esiintymisestä Kolmio lähdekoodissa toistuvasti. Java tarjoaa tuontilausekkeen käteväksi vaihtoehdoksi jättää pois pitkät pakettitiedot.

Tuontilauseke tuo tyyppejä paketista kertomalla kääntäjälle, mistä etsiä pätevöimätön (ei paketin etuliitettä) -tyyppien nimet käännöksen aikana. Se näkyy lähdetiedoston yläosassa ja sen on noudatettava seuraavaa syntaksia:

 tuonti tunniste[.tunniste]*.(typeName | *); 

Tuontilauseke alkaa varatulla sanalla tuonti ja jatkuu tunnisteella, jota valinnaisesti seuraa jaksoittain erotettu tunnisteiden sekvenssi. Tyypin nimi tai tähti (*) seuraa, ja puolipiste lopettaa tämän lauseen.

Syntaksi paljastaa tuontilausekkeen kaksi muotoa. Ensin voit tuoda yhden tyyppinimen, joka tunnistetaan typeName. Toiseksi voit tuoda kaikki tyypit, jotka tunnistetaan tähdellä.

* symboli on jokerimerkki, joka edustaa kaikkia luokittelemattomia tyyppinimiä. Se kehottaa kääntäjää etsimään tällaisia ​​nimiä tuontilausekkeen pakettijärjestyksen oikeassa reunassa olevasta paketista, ellei tyypin nimeä löydy aiemmin haetusta paketista. Huomaa, että jokerimerkin käytöstä ei seuraa suoritusrangaistusta eikä se johda koodin turpoamiseen. Se voi kuitenkin johtaa nimiristiriitoihin, jotka näet.

Esimerkiksi, tuoda ca.javajeff.graafisia kuvia.Triangle; kertoo kääntäjälle, että pätemätön Kolmio luokka on olemassa ca. javajeff grafiikka paketti. Samoin jotain

 tuoda noin. javajeff-grafiikkaa. *; 

käskee kääntäjän etsimään tätä pakettia kohdatessaan a Kolmio nimi, a Ympyrä nimi tai jopa Tili nimi (jos Tili ei ole jo löydetty).

Vältä * monikehittäjäprojekteissa

Kun työskentelet monikehittäjäprojektissa, vältä * jokerimerkki, jotta muut kehittäjät näkevät helposti, mitä tyyppejä lähdekoodissasi käytetään.

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