Programavimas

„Java 101“: Paketai organizuoja klases ir sąsajas

Kodėl reikia iš naujo išrasti ratą? Ta klišė taikoma programinės įrangos kūrimui, kai kai kurie kūrėjai dažnai perrašo tą patį kodą skirtingoms programoms. Du šio požiūrio trūkumai yra šie:

  1. Tai eikvoja laiką
  2. Tai pristato derinimo kodo klaidų potencialą

Kaip alternatyva to paties kodo perrašymui, daugelyje programinės įrangos kūrimo aplinkų yra bibliotekos įrankis, kuris organizuoja dažnai naudojamą kodą. Kūrėjai, baigę derinti kai kuriuos daugkartinio naudojimo kodus, naudoja įrankį, kad šį kodą išsaugotų a biblioteka- vienas ar daugiau failų, kuriuose yra dažnai naudojamas kodas, skirtas naudoti įvairiose programose. Kuriant programą, kompiliatorius arba bibliotekos įrankis pasiekia biblioteką, kad sujungtų programos bibliotekos kodą su programa.

Bibliotekos yra pagrindinės „Java“. Jie iš dalies leidžia JVM „classloader“ surasti klasės failus. (Aptarsiu klasių pakrovėjus būsimame straipsnyje.) Dėl šios priežasties „Java“ bibliotekos paprastai žinomos kaip klasės bibliotekos. Tačiau „Java“ klasių bibliotekas nurodo kaip pakuotės.

Šiame straipsnyje nagrinėjami paketai; Aš jums parodysiu, kaip sukurti klasių ir sąsajų paketus, kaip importuoti (tai yra, įtraukti į programą) supakuotas klases ir sąsajas, kaip perkelti paketus kietajame diske ir kaip naudoti jar failus paketams paketuoti.

Pastaba
Šio straipsnio vieno paketo eksperimentas yra skirtas „Microsoft Windows“. Turėtumėte sugebėti lengvai ekstrapoliuoti šį eksperimentą ne „Windows“ platformose.

Kas yra paketai?

A pakuotė yra klasių ir sąsajų rinkinys. Kiekvienas paketas turi savo pavadinimą ir organizuoja savo aukščiausio lygio (tai yra nesusijusias) klases ir sąsajas į atskiras vardų sritis, ar vardų kolekcija. Nors to paties pavadinimo klasės ir sąsajos negali būti rodomos tame pačiame pakete, jos gali būti rodomos skirtinguose paketuose, nes kiekvienam paketui priskiriama atskira vardų sritis.

Žiūrint iš įgyvendinimo perspektyvos, paketo prilyginimas katalogui yra naudingas, taip pat paketo klasių ir sąsajų prilyginimas katalogo klasių failams. Turėkite omenyje kitus metodus, pvz., Duomenų bazių naudojimą, įgyvendinant paketus, todėl neįpraskite visada sutapatinti paketus su katalogais. Kadangi daugelis JVM naudoja katalogus paketams įgyvendinti, šiame straipsnyje paketai prilyginami katalogams. „Java 2 SDK“ organizuoja savo didžiulę klasių ir sąsajų kolekciją į medžių pavidalo paketų paketų hierarchiją, kuri prilygsta katalogams kataloguose. Ta hierarchija leidžia „Sun Microsystems“ lengvai paskirstyti (ir jums lengvai dirbti) tas klases ir sąsajas. „Java“ paketų pavyzdžiai:

  • java.lang: Su kalba susijusių klasių rinkinys, pvz Objektas ir Stygos, organizuotas java pakuotės lang paketas
  • java.lang.ref: Su nuorodomis susijusių kalbos pamokų rinkinys, pvz „SoftReference“ ir ReferenceQueue, organizuotas nuoroda sub-paketas java pakuotės lang paketas
  • javax.sūpynės: Su „Swing“ susijusių komponentų klasių rinkinys, pvz JMygtukasir sąsajos, tokios kaip MygtukasModelis, organizuotas javax pakuotės sūpynės paketas

Laikotarpio simboliai atskiria paketų pavadinimus. Pavyzdžiui, javax.sūpynės, taško simbolis atskiria paketo pavadinimą javax nuo pakuotės pavadinimo sūpynės. Punkto simbolis yra nuo platformos nepriklausomas pasvirojo brūkšnio simbolių atitikmuo (/), atgalinio brūkšnio ženklai (\), arba kiti simboliai, skirti atskirti katalogų pavadinimus katalogų paketuose, duomenų bazių šakos hierarchiniame duomenų bazių paketų diegime ir pan.

Patarimas
Kaip negalite tame pačiame kataloge laikyti failo ir katalogo su identiškais pavadinimais, negalėsite tame pačiame pakete laikyti klasės ar sąsajos ir paketo su identiškais pavadinimais. Pavyzdžiui, atsižvelgiant į paketą pavadinimu sąskaitos, negalite laikyti ir pakuotės, ir klasės, pavadintos mokėtinas į sąskaitos. Kad išvengtumėte prieštaringų pavadinimų, pirmąją klasės ir sąsajos pavadinimų raidę įveskite didžiosiomis raidėmis, o paketų pavadinimų pirmąją raidę - mažosiomis raidėmis. Naudodamas ankstesnį pavyzdį, parduotuvės klasė Mokama pakuotėje sąskaitos kaip sąskaitos. Mokėtina ir pakuotėje mokėtinas pakuotėje sąskaitos kaip sąskaitos.mokėtinos. Sužinokite daugiau apie šį ir kitus „Sun“ vardų suteikimo būdus „Java“ programavimo kalbos kodų konvencijos.

Sukurkite klasių ir sąsajų paketą

Kiekvieno šaltinio failo klasės ir sąsajos sutvarkomos į paketą. Viduje konors pakuotė direktyvos nėra, šios klasės ir sąsajos priklauso neįvardytam paketui (katalogas, kurį JVM laiko dabartiniu katalogu - katalogas, kuriame „Java“ programa pradeda vykdyti per „Windows“ java.exearba lygiavertė OS programa ir joje nėra pakuočių). Bet jei pakuotė direktyva rodoma šaltinio faile, ta direktyva pavadina tų klasių ir sąsajų paketą. Norėdami nurodyti a, naudokite šią sintaksę pakuotė direktyva šaltinio kode:

„paketas“ packageName [ '.' subpackageName ... ] ';' 

A pakuotė direktyva prasideda pakuotė raktinis žodis. Identifikatorius, pavadinantis paketą, packageName, tuoj pat seka. Jei klasės ir sąsajos turi atsirasti pakuotėje (tam tikru lygiu) packageName, vienas ar daugiau atskirų laikotarpių subpackageName identifikatoriai atsiranda po packageName. Šiame kodo fragmente pateikiama pora pakuotė direktyvos:

paketinis žaidimas; paketinis žaidimas.įrenginiai; 

Pirmas pakuotė direktyva identifikuoja paketą pavadinimu žaidimas. Visos šios direktyvos šaltinio faile rodomos klasės ir sąsajos sutvarkomos žaidimas pakuotė. Antras pakuotė direktyva identifikuoja paketą pavadinimu prietaisai, kuris yra pakete pavadinimu žaidimas. Visos šios direktyvos šaltinio faile rodomos klasės ir sąsajos sutvarkomos žaidimas pakuotės prietaisai paketas. Jei JVM diegimas paketų pavadinimus priskiria katalogų pavadinimams, žaidimas.įrenginiai žemėlapiai į a žaidimas \ prietaisai katalogų hierarchija sistemoje „Windows“ ir a žaidimas / prietaisai katalogų hierarchija pagal „Linux“ arba „Solaris“.

Atsargiai
Tik vienas pakuotė direktyva gali būti rodoma šaltinio faile. Be to, pakuotė direktyva turi būti pirmasis kodas (išskyrus komentarus) toje byloje. Pažeidus bet kurią taisyklę „Java“ kompiliatorius praneša apie klaidą.

Kad galėčiau lengviau naudotis paketais, paruošiau pavyzdį, apimančią visas šio straipsnio temas. Šiame skyriuje sužinosite, kaip sukurti pavyzdžio paketą. Vėlesniuose skyriuose sužinosite, kaip importuoti klasę ir sąsają iš šio paketo, kaip perkelti šį paketą į kitą vietą standžiajame diske ir vis tiek pasiekti paketą iš programos ir kaip išsaugoti paketą „jar“ faile . 1 sąraše pateikiamas paketo šaltinio kodas:

Sąrašas 1. A.java

// A.java paketas testpkg; visuomenės klasė A {int x = 1; public int y = 2; apsaugotas int z = 3; int returnx () {return x; } public int returny () {grąžinti y; } apsaugotas int returnz () {return z; } viešoji sąsaja „StartStop“ {void start (); negaliojantis sustojimas (); }} B klasė {public static void labas () {System.out.println ("labas"); }} 

1 sąrašas supažindina jūsų pirmąjį pavadintą paketą su šaltinio kodu. paketas testpkg; direktyva įvardija tą paketą testpkg. Viduje testpkg yra klasės A ir B. Viduje A yra trys lauko deklaracijos, trys metodo deklaracijos ir vidinės sąsajos deklaracijos. Viduje B yra vieno metodo deklaracija. Visas šaltinio kodas saugomas A.java nes A yra vieša klasė. Mūsų užduotis: paverskite šį šaltinio kodą paketu, kurį sudaro dvi klasės ir vidinė sąsaja (arba katalogas, kuriame yra trys klasės failai). Šie uždaviniai atliekami vykdant šiuos „Windows“ veiksmus:

  1. Atidarykite „Windows“ komandų langą ir įsitikinkite, kad esate c: disko šakninis katalogas (pagrindinis katalogas - žymimas pradiniu atgaliniu pasviruoju brūkšniu (\) charakteris). Norėdami tai padaryti, įveskite c: komandą, po kurios eina CD \ komandą. (Jei naudojate kitą diską, pakeiskite c: pasirinktu disku. Įvedę komandą, nepamirškite paspausti klavišo Enter.)
  2. Sukurti testpkg katalogą įvesdami md testpkg. Pastaba: Vykdydami šio straipsnio veiksmus, po komandų nerašykite taškų.
  3. Padarykite testpkg dabartinį katalogą įvesdami CD testpkg.
  4. Redaktoriumi įveskite 1 sąrašo šaltinio kodą ir išsaugokite kodą A.java failą testpkg.
  5. Sudaryti A.java rašydami javacas A.java. Turėtumėte pamatyti klasės failus $ StartStop.class, Klasėir B.klasė pasirodys testpkg kataloge.

1 paveiksle pavaizduoti 3–5 žingsniai.

Sveikiname! Jūs ką tik sukūrėte savo pirmąjį paketą. Pagalvokite apie šį paketą kaip apie dvi klases (A ir B) ir Avidinė sąsaja („StartStop“). Taip pat galite galvoti apie šį paketą kaip katalogą, kuriame yra trys klasės failai: $ StartStop.class, Klasėir B.klasė.

Pastaba
Siekdama sumažinti paketų pavadinimų konfliktus (ypač tarp komercinių paketų), „Sun“ sukūrė susitarimą, pagal kurį įmonės interneto domeno vardas pakeičia paketų pavadinimą. Pavyzdžiui, įmonė su x.com kaip savo interneto domeno vardą ir a.b kaip paketo pavadinimą (a), po kurio nurodomas pakuotės pavadinimas (b) priešdėliai com.x į a.b, kurio rezultatas com.x.a.b. Mano straipsnis neatitinka šios konvencijos, nes testpkg paketas yra išmesti skirtas tik mokymo tikslams.

Importuokite paketo klases ir sąsajas

Turėdami paketą, norėsite importuoti klases ir (arba) sąsajas, iš tikrųjų, klasių ir (arba) sąsajų pavadinimus, iš to paketo į savo programą, kad ji galėtų naudoti tas klases ir (arba) sąsajas. Vienas iš būdų atlikti šią užduotį yra pateikti pilną paketo pavadinimą (paketo pavadinimą ir visus paketų pavadinimus) kiekvienoje vietoje, kur rodomas nuorodos tipo pavadinimas (klasės arba sąsajos pavadinimas), kaip rodo 2 sąrašas:

Sąrašas 2. Usetestpkg1.java

// „Usetestpkg1.java“ klasė „Usetestpkg1“ įgyvendina testpkg.A.StartStop {public static void main (String [] args) {testpkg.A a = new testpkg.A (); System.out.println (a.y); System.out.println (a.returny ()); „Usetestpkg1 utp“ = naujas „Usetestpkg1“ (); utp.start (); utp.stop (); } public void start () {System.out.println ("Pradėti"); } public void stop () {System.out.println ("Stop"); }} 

Priešdėliais testpkg. į A, Naudojimaspkg1 prieigos testpkgklasės A dviejose vietose ir Avidinė sąsaja „StartStop“ vienoje vietoje. Norėdami sukompiliuoti ir paleisti, atlikite šiuos veiksmus Naudojimaspkg1:

  1. Atidarykite „Windows“ komandų langą ir įsitikinkite, kad esate c: disko šakninis katalogas.
  2. Užtikrinkite klasės kelias aplinkos kintamasis neegzistuoja vykdant nustatyti klasės kelią =. (Aptariu klasės kelias vėliau šiame straipsnyje.)
  3. Redaktoriumi įveskite 2 sąrašo šaltinio kodą ir išsaugokite tą kodą Naudokitepkg1.java failą šakniniame kataloge.
  4. Sudaryti Naudokitepkg1.java rašydami javac Usetestpkg1.java. Turėtumėte pamatyti klasės failą Naudokitepkg1.class pasirodys šakniniame kataloge.
  5. Tipas java Usetestpkg1 paleisti šią programą.

2 paveiksle pavaizduoti 3–5 žingsniai ir parodyti programos rezultatai.

Pagal Naudojimaspkg1produkcija, pagrindinis () metodo gija sėkmingai pasiekiama testpkg.A's y lauką ir skambina pakartoti () metodas. Be to, iš rezultatų matyti, kad sėkmingai įgyvendinta testpkg.A.StartStop vidinė sąsaja.

Dėl Naudojimaspkg1, priešdėlis testpkg. į A trijose vietose neatrodo didelė problema. Bet kas nori šimte vietų nurodyti visiškai kvalifikuotą paketo pavadinimo priešdėlį? Laimei, „Java“ tiekia importas direktyvą importuoti paketo viešojo nuorodos tipo pavadinimą (-us), todėl jums nereikia įvesti visiškai kvalifikuotų paketo pavadinimo priešdėlių. Išreikškite an importas direktyvą šaltinio kode naudojant šią sintaksę:

„importas“ packageName [ '.' subpackageName ... ] '.' ( referencetypeName | '*' ) ';' 

An importas direktyvą sudaro importas raktinis žodis, po kurio iškart nurodomas identifikatorius, pavadinantis paketą, packageName. Neprivalomas sąrašas subpackageName Toliau pateikiami identifikatoriai, norint nustatyti tinkamą paketą (jei reikia). Direktyvos pabaigoje pateikiama arba a referencetypeName identifikatorius, identifikuojantis konkrečią klasę ar sąsają iš paketo, arba žvaigždutė (*) charakteris. Jei referencetypeName pasirodo, direktyva yra a vieno tipo importas direktyvą. Jei pasirodys žvaigždutė, direktyva yra a tipo pagal pareikalavimą importas direktyvą.

Atsargiai
Kaip ir su pakuotė direktyva, importas direktyvos turi būti prieš bet kurį kitą kodą, išskyrus tris išimtis: a pakuotė direktyva, kita importas direktyvas ar komentarus.

Vieno tipo importas direktyva iš paketo importuoja vieno viešo nuorodos tipo pavadinimą, kaip rodo šis kodo fragmentas:

importuoti java.util.Date; 

Ankstesnis vieno tipo importas direktyva importuoja klasės pavadinimą Data į šaltinio kodą. Dėl to jūs nurodote Data vietoj java.util.Data kiekvienoje vietoje tas klasės pavadinimas yra šaltinio kode. Pavyzdžiui, kuriant Data objektas, nurodykite Data d = nauja data (); vietoj java.util.Date d = nauja java.util.Date ();.

Būkite atsargūs su vieno tipo importas direktyvas. Jei kompiliatorius aptinka vieno tipo importas direktyvą, kurioje nurodomas šaltinio faile nurodytas nuorodos tipo pavadinimas, kompiliatorius praneša apie klaidą, kaip parodo šis kodo fragmentas:

importuoti java.util.Date; klasės data {} 

Kompiliatorius laiko kodo fragmentą bandymu įvesti du vienodus nuorodų tipus Data vardas: