Ohjelmointi

Java 101: Paketit järjestävät luokkia ja rajapintoja

Miksi pyörä keksitään uudelleen? Tämä klisee koskee ohjelmistokehitystä, jossa jotkut kehittäjät kirjoittavat usein saman koodin eri ohjelmille. Kaksi haittapuolta tässä lähestymistavassa ovat:

  1. Se tuhlaa aikaa
  2. Se tuo virheenkorjauskoodiin mahdollisuuden

Vaihtoehtona saman koodin uudelleenkirjoittamiselle monet ohjelmistokehitysympäristöt tarjoavat kirjastotyökalun, joka järjestää usein käytetyn koodin. Kun kehittäjät ovat suorittaneet jonkin uudelleen käytettävän koodin virheenkorjauksen, he käyttävät työkalua koodin tallentamiseen a kirjasto— Yksi tai useampi tiedosto, joka sisältää usein käytettyä koodia käytettäväksi eri ohjelmissa. Ohjelman rakentamisen aikana kääntäjä tai kirjastotyökalu käyttää kirjastoa yhdistääkseen ohjelman kirjastoon viitatun koodin ohjelmaan.

Kirjastot ovat Java: n perustekijöitä. Ne antavat JVM: n classloaderille mahdollisuuden paikantaa luokkatiedostot. (Tutkin luokan lataajia tulevassa artikkelissa.) Tästä syystä Javan kirjastot tunnetaan yleisesti nimellä luokan kirjastot. Java viittaa kuitenkin luokkakirjastoihin nimellä paketteja.

Tässä artikkelissa tutkitaan paketteja; Näytän sinulle, kuinka luodaan paketteja luokista ja rajapinnoista, kuinka tuodaan (eli tuodaan ohjelmaan) pakattuja luokkia ja rajapintoja, kuinka paketteja siirretään kiintolevylle ja miten jar-tiedostoja käytetään pakettien kapseloinnissa.

Merkintä
Tämän artikkelin yksittäinen pakettikokeilu on Microsoft Windows -kohtainen. Sinun pitäisi pystyä ekstrapoloimaan tämä kokeilu helposti muille kuin Windows-alustoille.

Mitä paketit ovat?

A paketti on kokoelma luokkia ja rajapintoja. Jokaisella paketilla on oma nimi ja se järjestää ylätason (eli sisäkkäiset) luokat ja käyttöliittymät erillisiksi nimitila, tai nimikokoelma. Vaikka samannimisiä luokkia ja käyttöliittymiä ei voi esiintyä samassa paketissa, ne voivat näkyä eri paketeissa, koska kullekin paketille annetaan erillinen nimitila.

Toteutuksen näkökulmasta paketin rinnastaminen hakemistoon osoittautuu hyödylliseksi, samoin paketin luokkien ja rajapintojen tasaaminen hakemiston luokkatiedostoihin. Pidä mielessä muut lähestymistavat - kuten tietokantojen käyttö - pakettien toteuttamiseen, joten älä tule tapana tasata paketteja aina hakemistoihin. Mutta koska monet JVM: t käyttävät hakemistoja pakettien toteuttamiseen, tämä artikkeli rinnastaa paketit hakemistoihin. Java 2 SDK järjestää laajan kokoelman luokkia ja rajapintoja pakettien puumaiseksi pakettien hierarkiaksi, mikä vastaa hakemistojen hakemistoja. Kyseisen hierarkian avulla Sun Microsystems voi jakaa (ja sinun on helppo työskennellä) nämä luokat ja rajapinnat. Esimerkkejä Java-paketeista ovat:

  • java.lang: Kokoelma kielikursseja, kuten Esine ja Merkkijono, järjestetty java paketti lang alipaketti
  • java.lang.ref: Kokoelma viitteisiin liittyviä kielikursseja, kuten SoftReference ja ReferenceQueue, järjestetty viite alipaketti java paketti lang alipaketti
  • javax.swing: Kokoelma Swingiin liittyviä komponenttiluokkia, kuten JPainikeja rajapinnat, kuten PainikeMalli, järjestetty javax paketti keinu alipaketti

Aikamerkit erottavat pakettien nimet. Esimerkiksi javax.swing, pistemerkki erottaa paketin nimen javax alipaketin nimestä keinu. Pistemerkki on alustasta riippumaton vastaava viiva eteenpäin (/), vinoviivat (\), tai muita merkkejä hakemistojen nimien erottamiseksi hakemistopohjaisessa pakettitoteutuksessa, tietokannan haarat hierarkkisessa tietokantapohjaisessa pakettitoteutuksessa ja niin edelleen.

Kärki
Aivan kuten et voi tallentaa sekä tiedostoa että hakemistoa, jolla on identtiset nimet, samaan hakemistoon, et voi tallentaa luokkaa tai käyttöliittymää ja pakettia, jolla on identtiset nimet, samaan pakettiin. Esimerkiksi annetaan paketti nimeltä tilit, et voi tallentaa sekä pakettia että luokkaa nimeltä maksettava sisään tilit. Ristiriitojen välttämiseksi kirjoita luokan ja käyttöliittymän nimen iso kirjain ja paketin nimen ensimmäinen kirjain. Käyttämällä edellistä esimerkkiä, tallenna luokka Maksettava pakkauksessa tilit kuten Maksettava ja pakkaus maksettava pakkauksessa tilit kuten tilit. maksettava. Lisätietoja tästä ja muista Sunin nimeämiskäytännöistä Java-ohjelmointikielen kooditavat.

Luo paketti luokista ja rajapinnoista

Jokaisen lähdetiedoston luokat ja rajapinnat järjestyvät pakettiin. vuonna paketti Direktiivin puuttuessa nämä luokat ja käyttöliittymät kuuluvat nimeämättömään pakettiin (hakemisto, jota JVM pitää nykyisenä hakemistona - hakemisto, jossa Java-ohjelma aloittaa suorituksen Windowsin kautta java.exetai vastaava käyttöjärjestelmä (eikä sisällä alipaketteja). Mutta jos paketti -direktiivi esiintyy lähdetiedostossa, siinä nimetään paketti kyseisille luokille ja rajapinnoille. Määritä a seuraavalla syntaksilla paketti direktiivi lähdekoodissa:

'paketti' paketin nimi [ '.' subpackageName ... ] ';' 

A paketti direktiivi alkaa paketti avainsana. Tunniste, joka nimeää paketin, paketin nimi, seuraa välittömästi. Jos luokkia ja rajapintoja halutaan ilmoittaa alipaketissa (jossain tasossa) sisällä paketin nimi, yksi tai useampi jaksoerotettu subpackageName tunnisteet näkyvät jälkeen paketin nimi. Seuraava koodinpätkä esittää parin paketti direktiivit:

pakettipeli; pakettipeli.laitteet; 

Ensimmäinen paketti direktiivi tunnistaa paketin nimeltä peli. Kaikki kyseisen direktiivin lähdetiedostossa esiintyvät luokat ja rajapinnat järjestyvät peli paketti. Toinen paketti direktiivi tunnistaa nimetyn alipaketin laitteet, joka sijaitsee nimellisessä paketissa peli. Kaikki kyseisen direktiivin lähdetiedostossa esiintyvät luokat ja rajapinnat järjestyvät peli paketti laitteet alipaketti. Jos JVM-toteutus yhdistää pakettien nimet hakemistojen nimiin, game.devices kartat a peli \ laitteet hakemistohierarkia Windowsissa ja a peli / laitteet hakemistohierarkia Linuxissa tai Solarisissa.

Varoitus
Vain yksi paketti direktiivi voi näkyä lähdetiedostossa. Lisäksi paketti Direktiivin on oltava ensimmäinen koodi (kommentteja lukuun ottamatta) tiedostossa. Kummankin säännön rikkominen saa Java-kääntäjän ilmoittamaan virheestä.

Pakkausten mukavuuden parantamiseksi olen laatinut esimerkin, joka kattaa kaikki tämän artikkelin aiheet. Tässä osassa opit luomaan esimerkin paketin. Myöhemmissä osioissa opit tuomaan luokan ja käyttöliittymän tästä paketista, kuinka paketti siirretään toiseen paikkaan kiintolevylläsi ja silti käyttää pakettia ohjelmasta ja kuinka paketti tallennetaan jar-tiedostoon . Listaus 1 esittää paketin lähdekoodin:

Listaus 1. A.java

// A.java-paketin testpkg; julkinen luokka A {int x = 1; julkinen int y = 2; suojattu int z = 3; int returnx () {return x; } public int returny () {palaa y; } suojattu int returnz () {return z; } julkinen käyttöliittymä StartStop {void start (); mitätön pysäytys (); }} luokka B {public static void hello () {System.out.println ("hei"); }} 

Listaus 1 tuo lähdekoodin ensimmäiseen nimettyyn pakettiin. paketti testpkg; direktiivi nimittää kyseisen paketin testpkg. Sisällä testpkg ovat luokkia A ja B. Sisällä A ovat kolme kenttä-, kolme menetelmä- ja sisäisen rajapinnan ilmoitusta. Sisällä B on yhden menetelmän ilmoitus. Koko lähdekoodi tallennetaan A.java koska A on julkinen luokka. Tehtävämme: Muuta tämä lähdekoodi paketiksi, joka koostuu kahdesta luokasta ja sisäisestä käyttöliittymästä (tai hakemistosta, joka sisältää kolme luokkatiedostoa). Seuraavat Windows-kohtaiset vaiheet suorittavat tämän tehtävän:

  1. Avaa Windowsin komentoikkuna ja varmista, että olet c: aseman juurihakemisto (päähakemisto - jota edustaa alkuviiva (\) merkki). Voit tehdä tämän kirjoittamalla c: -komento, jota seuraa cd \ komento. (Jos käytät eri asemaa, vaihda c: valitsemallasi asemalla. Älä myöskään unohda painaa Enter-näppäintä komennon kirjoittamisen jälkeen.)
  2. Luo testpkg hakemistoon kirjoittamalla md testpkg. merkintä: Kun kirjoitat tämän artikkelin ohjeita, älä kirjoita pisteitä komentojen jälkeen.
  3. Tehdä testpkg nykyinen hakemisto kirjoittamalla cd testpkg.
  4. Syötä muokkausohjelmalla Listaus 1: n lähdekoodi ja tallenna koodi A.java tiedosto testpkg.
  5. Koota A.java kirjoittamalla javac A.java. Sinun pitäisi nähdä luokan tiedostot $ StartStop.class, Luokkaja B. luokka näkyvät testpkg hakemistoon.

Kuva 1 kuvaa vaiheet 3 - 5.

Onnittelut! Olet juuri luonut ensimmäisen pakettisi. Ajattele tätä pakettia sisältävän kaksi luokkaa (A ja B) ja Ayhden sisäisen käyttöliittymän (StartStop). Voit myös ajatella tätä pakettia hakemistona, joka sisältää kolme luokkatiedostoa: $ StartStop.class, Luokkaja B. luokka.

Merkintä
Minimoidakseen pakettien nimiristiriidat (erityisesti kaupallisten pakettien välillä), Sun on perustanut käytännön, jossa yrityksen Internet-verkkotunnus kääntää ja etuliittää paketin nimen. Esimerkiksi yritys, jolla x.com Internet - verkkotunnuksena ja a. b paketin nimellä (a), jota seuraa alipakkauksen nimi (b) etuliitteet com. x että a. b, johtaen com.x.a.b. Artikkelini ei noudata tätä käytäntöä, koska testpkg paketti on heittää pois vain opetustarkoituksiin.

Tuo paketin luokat ja käyttöliittymät

Kun sinulla on paketti, haluat tuoda luokat ja / tai rajapinnat - tosiasiallisesti luokkien ja / tai käyttöliittymien nimet - kyseisestä paketista ohjelmallesi, jotta se voi käyttää näitä luokkia ja / tai rajapintoja. Yksi tapa suorittaa tämä tehtävä on toimittaa täysin hyväksytty paketin nimi (paketin nimi ja kaikki alipakettien nimet) kussakin paikassa, jossa viitetyypin nimi (luokan tai käyttöliittymän nimi) esiintyy, kuten Listing 2 osoittaa:

Listaus 2. Usetestpkg1.java

// Usetestpkg1.java-luokka Usetestpkg1 toteuttaa testpkg.A.StartStop {public static void main (String [] args) {testpkg.A a = new testpkg.A (); System.out.println (ay); System.out.println (a.returny ()); Usetestpkg1 utp = uusi Usetestpkg1 (); utp.start (); utp.stop (); } public void start () {System.out.println ("Käynnistä"); } public void stop () {System.out.println ("Stop"); }} 

Etuliitteellä testpkg. että A, Käytä testkg1 pääsy testpkgluokan A kahdessa paikassa ja Asisäisen käyttöliittymän StartStop yhdessä paikassa. Suorita seuraavat vaiheet koota ja suorittaa Käytä testkg1:

  1. Avaa Windowsin komentoikkuna ja varmista, että olet c: aseman juurihakemisto.
  2. Varmista, että luokkatie ympäristömuuttujaa ei ole olemassa suorittamalla set classpath =. (Keskustelen luokkatie myöhemmin tässä artikkelissa.)
  3. Syötä muokkausohjelmalla Listing 2: n lähdekoodi ja tallenna koodi a: hon Käytä testpkg1.java tiedosto juurihakemistossa.
  4. Koota Käytä testpkg1.java kirjoittamalla javac Usetestpkg1.java. Sinun pitäisi nähdä luokan tiedosto Käytä testkg1luokkaa näkyvät juurihakemistossa.
  5. Tyyppi java Usetestpkg1 tämän ohjelman suorittamiseksi.

Kuva 2 kuvaa vaiheet 3 - 5 ja näyttää ohjelman tuotoksen.

Mukaan Käytä testkg1tuotos, main () method-ketju käyttää onnistuneesti testipkg.Aon y -kenttään ja kutsuu palata () menetelmä. Lisäksi tulos osoittaa ohjelman onnistuneen toteuttamisen testpkg.A.StartStop sisäinen käyttöliittymä.

Sillä Käytä testkg1, etuliite testpkg. että A kolmessa paikassa ei tunnu iso juttu. Mutta kuka haluaa määrittää täysin hyväksytyn paketin nimen etuliitteen sadassa paikassa? Onneksi Java toimittaa tuonti -direktiivi tuoda paketin julkisen viitetyypin nimi (t), joten sinun ei tarvitse kirjoittaa pakollisia paketin nimen etuliitteitä. Express tuonti direktiivin lähdekoodissa seuraavan syntaksin kautta:

'tuonti' paketin nimi [ '.' subpackageName ... ] '.' ( referencetypeName | '*' ) ';' 

An tuonti direktiivi koostuu tuonti avainsana, jota seuraa välittömästi tunniste, joka nimeää paketin, paketin nimi. Valinnainen luettelo subpackageName tunnisteet seuraavat sopivan alipaketin tunnistamiseksi (tarvittaessa). Direktiivin lopussa on joko a referencetypeName tunniste, joka tunnistaa tietyn luokan tai käyttöliittymän paketista, tai tähti (*) merkki. Jos referencetypeName ilmestyy, direktiivi on a yksityyppinen tuonti direktiivi. Jos tähtimerkki ilmestyy, direktiivi on a tyyppi-on-demand tuonti direktiivi.

Varoitus
Kuten paketti direktiivi, tuonti direktiivien on oltava ennen muita koodeja, lukuun ottamatta kolmea poikkeusta: a paketti direktiivi, muu tuonti direktiivejä tai kommentteja.

Yksityyppi tuonti Direktiivi tuo yhden julkisen viitetyypin nimen paketista, kuten seuraava koodinpätkä osoittaa:

tuo java.util.Date; 

Edellinen yksityyppi tuonti direktiivi tuo luokan nimen Päivämäärä lähdekoodiksi. Tämän seurauksena määrität Päivämäärä sijasta java.util.Päiväys kussakin paikassa kyseisen luokan nimi esiintyy lähdekoodissa. Esimerkiksi, kun luot a Päivämäärä objekti, määritä Päivämäärä d = uusi päivämäärä (); sijasta java.util.Date d = uusi java.util.Date ();.

Ole varovainen yhden tyyppisellä tuonti direktiivejä. Jos kääntäjä havaitsee yhden tyypin tuonti Direktiivi, joka määrittää myös lähdetiedostossa ilmoitetun viitetyypin nimen, kääntäjä ilmoittaa virheestä, kuten seuraava koodiosa osoittaa:

tuo java.util.Date; luokan päivämäärä {} 

Kääntäjä pitää koodifragmenttia yrityksenä ottaa käyttöön kaksi samaa viitetyyppiä Päivämäärä nimi: