Manā iepriekšējā Java 101 apmācība, jūs uzzinājāt, kā labāk kārtot kodu, deklarējot atsauces tipus (sauktus arī par klasēm un saskarnēm) kā citu atsauces tipu un bloku dalībniekus. Es arī parādīju, kā izmantot ligzdošanu, lai izvairītos no nosaukumu konfliktiem starp ligzdotajiem atsauces tipiem un augstākā līmeņa atsauces tipiem, kuriem ir tāds pats nosaukums.
Kopā ar ligzdošanu Java izmanto paketes, lai atrisinātu viena nosaukuma problēmas augstākā līmeņa atsauces tipos. Izmantojot statisko importēšanu, tiek vienkāršota arī piekļuve statiskajiem dalībniekiem iesaiņotos augstākā līmeņa atsauces veidos. Statiskā importēšana ietaupīs taustiņsitienus, piekļūstot šiem locekļiem savā kodā, taču ir dažas lietas, no kurām jāpievērš uzmanība, kad tās izmantojat. Šajā apmācībā es jūs iepazīstināšu ar pakotņu izmantošanu un statisko importēšanu jūsu Java programmās.
lejupielādēt Iegūt kodu Lejupielādējiet avota kodu, piemēram, lietojumprogrammām šajā Java apmācībā. Izveidoja Jeff Friesen JavaWorld.Iepakojuma atsauces veidi
Java izstrādātāji grupē saistītās klases un saskarnes paketēs. Izmantojot paketes, ir vieglāk atrast un izmantot atsauces veidus, izvairīties no nosaukuma konfliktiem starp tā paša nosaukuma tipiem un kontrolēt piekļuvi tipiem.
Šajā sadaļā jūs uzzināsiet par pakotnēm. Jūs uzzināsiet, kādi ir paketes, uzziniet par iepakojums
un importēt
paziņojumus un izpētiet papildu tēmas par aizsargātu piekļuvi, JAR failiem un tipu meklēšanu.
Kas ir paketes Java?
Programmatūras izstrādē mēs parasti kārtojam vienumus atbilstoši to hierarhiskajām attiecībām. Piemēram, iepriekšējā apmācībā es jums parādīju, kā deklarēt klases kā citu klašu dalībniekus. Mēs varam arī izmantot failu sistēmas, lai ligzdotu direktorijus citos direktorijos.
Šo hierarhisko struktūru izmantošana palīdzēs izvairīties no nosaukumu konfliktiem. Piemēram, nemierarhiskā failu sistēmā (vienā direktorijā) nav iespējams piešķirt vienu un to pašu nosaukumu vairākiem failiem. Turpretī hierarhiska failu sistēma ļauj nosauktiem failiem pastāvēt dažādos direktorijos. Līdzīgi, divās pievienojošās klasēs var būt viena nosaukuma ligzdotas klases. Vārdu konflikti nepastāv, jo vienumi tiek sadalīti dažādās nosaukumvietās.
Java arī ļauj mums sadalīt augstākā līmeņa (bez ligzdām) atsauces tipus vairākās nosaukumvietās, lai mēs varētu labāk sakārtot šos tipus un novērst nosaukumu konfliktus. Programmā Java mēs izmantojam pakotnes valodas funkciju, lai sadalītu augšējā līmeņa atsauces veidus vairākās nosaukumvietās. Šajā gadījumā a iepakojums ir unikāla nosaukumvieta atsauces tipu glabāšanai. Paketes var glabāt klases un saskarnes, kā arī apakšpaketes, kas ir pakas, kas ligzdotas citos iepakojumos.
Iepakojumam ir nosaukums, kuram jābūt rezervētam identifikatoram; piemēram, java
. Dalībnieku piekļuves operators (.
) atdala pakotnes nosaukumu no apakškopas nosaukuma un atdala pakas vai paketes nosaukumu no tipa nosaukuma. Piemēram, divu dalībnieku piekļuves operatori java.lang.Sistēma
atsevišķs paketes nosaukums java
no lang
apakšpakas nosaukums un atsevišķs paketes nosaukums lang
no Sistēma
tipa nosaukums.
Jānorāda atsauces tipi publiski
lai tie būtu pieejami no iepakojuma ārpuses. Tas pats attiecas uz visām konstantēm, konstruktoriem, metodēm vai ligzdotajiem veidiem, kuriem jābūt pieejamiem. To piemērus vēlāk redzēsit apmācībā.
Paketes paziņojums
Java valodā mēs izmantojam paketes izraksts lai izveidotu paketi. Šis paziņojums parādās avota faila augšdaļā un identificē paketi, kurai pieder avota failu tipi. Tam jāatbilst šādai sintaksei:
iepakojums identifikators[.identifikators]*;
Paketes izraksts sākas ar rezervēto vārdu iepakojums
un turpina ar identifikatoru, kam pēc izvēles seko identifikatoru secība, kas atdalīta ar periodu. Semikols (;
) izbeidz šo paziņojumu.
Pirmais (visvairāk pa kreisi) identifikators nosauc paketi, un katrs nākamais identifikators - paketi. Piemēram, pakete a.b;
, visi avota failā deklarētie veidi pieder b
apakšpakete a
iepakojums.
Iepakojuma / apakškopu nosaukšanas kārtība
Pēc vienošanās mēs izsakām pakas vai apakšpakas nosaukumu ar mazajiem burtiem. Ja nosaukums sastāv no vairākiem vārdiem, iespējams, vēlēsities rakstīt ar lielajiem burtiem katru vārdu, izņemot pirmo; piemēram, virsgrāmata
.
Lai izvairītos no kompilācijas problēmām, pakotņu nosaukumu secībai jābūt unikālai. Piemēram, pieņemsim, ka jūs izveidojat divas dažādas grafika
un pieņemsim, ka katrs grafika
iepakojumā ir a Trīsstūris
klase ar citu saskarni. Kad Java kompilators sastopas ar kaut ko līdzīgu tam, kas atrodas zemāk, tam jāpārbauda, vai Trīsstūris (int, int, int, int)
konstruktors pastāv:
Trijstūris t = jauns trīsstūris (1, 20, 30, 40);
Trijstūra norobežojošā kaste
Padomājiet par Trīsstūris
konstruktors kā norobežojošās kastes norādīšana, kurā uzzīmēt trīsstūri. Pirmie divi parametri identificē lodziņa augšējo kreiso stūri, bet otrie divi parametri nosaka lodziņa apjomu.
Sastādītājs meklēs visas pieejamās paketes, līdz atradīs grafika
pakete, kas satur a Trīsstūris
klasē. Ja atrastajā iepakojumā ir atbilstoša Trīsstūris
klase ar a Trīsstūris (int, int, int, int)
konstruktor, viss ir kārtībā. Pretējā gadījumā, ja atrasts Trīsstūris
klasei nav Trīsstūris (int, int, int, int)
konstruktors, sastādītājs ziņo par kļūdu. (Es vairāk pastāstīšu par meklēšanas algoritmu vēlāk šajā apmācībā.)
Šis scenārijs parāda, cik svarīgi ir izvēlēties unikālas pakotņu nosaukumu sekvences. Konvencijas, izvēloties unikālu vārdu secību, ir mainīt interneta domēna vārdu un izmantot to kā secības prefiksu. Piemēram, es izvēlētos ca. javajefs
kā manu prefiksu, jo javajeff.ca
ir mans domēna vārds. Tad es precizētu ca.javajeff.grafika.Trīsstūris
piekļūt Trīsstūris
.
Domēna vārda komponenti un derīgi pakotņu nosaukumi
Domēna vārda komponenti ne vienmēr ir derīgi pakotņu nosaukumi. Viens vai vairāki komponentu nosaukumi var sākties ar ciparu (3D.com
), satur defisi (-
) vai cita nelikumīga rakstura (ab-z.com
) vai būt viens no Java rezervētajiem vārdiem (short.com
). Konvencija nosaka, ka ciparu pirms prefiksa (com._3D
), nelikumīgo rakstzīmi aizstāj ar pasvītrojumu (com.ab_z
), un rezervēto vārdu papildini ar pasvītrojumu (com.short_
).
Jums jāievēro daži noteikumi, lai izvairītos no papildu problēmām ar pakotnes izrakstu:
- Avota failā varat deklarēt tikai vienu pakotnes izrakstu.
- Pirms pakotnes paziņojuma nevar ievadīt neko citu, izņemot komentārus.
Pirmais noteikums, kas ir īpašs otrā noteikuma gadījums, pastāv, jo nav jēgas glabāt atsauces tipu vairākos paketēs. Lai gan pakete var uzglabāt vairākus veidus, tips var piederēt tikai vienai pakotnei.
Ja avota fails nedeklarē pakotnes paziņojumu, tiek uzskatīts, ka avota faila tipi pieder pie nenosaukta pakete. Netriviālie atsauces tipi parasti tiek glabāti savos iepakojumos, un tie ļauj izvairīties no nosaukuma.
Java ieviešana pakotņu un apakšpaku nosaukumus kartē ar tāda paša nosaukuma direktorijiem. Piemēram, ieviešana kartētu grafika
uz direktoriju ar nosaukumu grafika
. Iepakojuma gadījumā a.b
, pirmais burts, a kartētu direktorijā ar nosaukumu a
un b kartētu uz a b
apakšdirektorija a
. Kompilators attiecīgajā direktorijā saglabā klases failus, kas ievieš paketes veidus. Ņemiet vērā, ka nenosaukta pakete atbilst pašreizējam direktorijam.
Piemērs: Audio bibliotēkas iesaiņošana Java
Praktisks piemērs ir noderīgs, lai pilnībā izprastu iepakojums
paziņojums, apgalvojums. Šajā sadaļā es demonstrēju paketes audio bibliotēkas kontekstā, kas ļauj lasīt audio failus un iegūt audio datus. Īsuma labad es uzrādīšu tikai bibliotēkas skeleta versiju.
Pašlaik audio bibliotēku veido tikai divas klases: Audio
un WavReader
. Audio
apraksta audio klipu un ir bibliotēkas galvenā klase. 1. saraksts parāda tā pirmkodu.
Saraksts 1. Paketes izraksta piemērs (Audio.java)
pakete ca.javajeff.audio; public final class Audio {private int [] paraugi; private int sampleRate; Audio (int [] paraugi, int sampleRate) {this.paraugi = paraugi; this.sampleRate = sampleRate; } public int [] getSamples () {atgriezt paraugus; } public int getSampleRate () {return sampleRate; } public static Audio newAudio (virknes faila nosaukums) {if (filename.toLowerCase (). endWith (". wav")) atgriež WavReader.read (faila nosaukums); else atgriezties null; // neatbalstīts formāts}}
Soli pa solim apskatīsim 1. sarakstu.
- The
Audio.java
1. saraksta fails glabāAudio
klasē. Šis saraksts sākas ar pakotnes paziņojumu, kas identificēca.javajeff.audio
kā klases pakete. Audio
tiek deklarētspubliski
lai uz to varētu atsaukties ārpus tā paketes. Turklāt tas ir deklarētsgalīgais
lai to nevarētu paplašināt (tas nozīmē, apakšklasē).Audio
paziņoPrivāts
paraugi
unsampleRate
lauki audio datu glabāšanai. Šie lauki tiek inicializēti vērtībām, kas nodotasAudio
konstruktors.Audio
ir paziņots konstruktors pakete-privāta (tas nozīmē, ka konstruktors nav deklarētspubliski
,Privāts
vaiaizsargāts
), lai šo klasi nevarētu izcelt ārpus tās paketes.Audio
dāvanasgetSamples ()
ungetSampleRate ()
audio klipa paraugu atgriešanas metodes un izlases biežums. Katra metode ir deklarētapubliski
lai to varētu izsaukt no ārpusesAudio
iepakojums.Audio
noslēdz ar apubliski
unstatisks
newAudio ()
rūpnīcas metodeAudio
objekts, kas atbilstfaila nosaukums
arguments. Ja audio klipu nevar iegūt,nulle
tiek atgriezta.newAudio ()
salīdzinafaila nosaukums
paplašinājums ar.wav
(šis piemērs atbalsta tikai WAV audio). Ja tie sakrīt, tas tiek izpildītsatgriezt WavReader.read (faila nosaukums)
atgrieztAudio
objekts ar WAV balstītiem audio datiem.
2. saraksts apraksta WavReader
.
Saraksts 2. WavReader palīgu klase (WavReader.java)
pakete ca.javajeff.audio; final class WavReader {static Audio read (String filename) {// Izlasiet faila nosaukuma faila saturu un apstrādājiet to // parauga vērtību masīvā un izlases ātruma // vērtībā. Ja failu nevar nolasīt, atgrieziet nulli. Attiecībā uz // īsumu (un tāpēc, ka es vēl neesmu apspriedis Java // failu I / O API), es uzskatu tikai skeleta kodu, kas // vienmēr atgriež audio objektu ar noklusējuma vērtībām. atgriezt jaunu audio (jauns int [0], 0); }}
WavReader
ir paredzēts WAV faila satura nolasīšanai Audio
objekts. (Klase galu galā būs lielāka ar papildu Privāts
lauki un metodes.) Ievērojiet, ka šī klase nav deklarēta publiski
, kas padara WavReader
pieejams Audio
bet ne kodēt ārpus ca.javajeff.audio
iepakojums. Padomā par WavReader
kā palīgu klase, kuras vienīgais pastāvēšanas iemesls ir kalpošana Audio
.
Lai izveidotu šo bibliotēku, veiciet šādas darbības:
- Kā pašreizējo direktoriju faila sistēmā atlasiet piemērotu vietu.
- Izveidojiet a
ca / javajeff / audio
apakšdirektorija hierarhija pašreizējā direktorijā. - Kopējiet 1. un 2. ierakstu failos
Audio.java
unWavReader.java
attiecīgi; un saglabājiet šos failusaudio
apakšdirektorijs. - Pieņemot, ka pašreizējā direktorijā ir
apm
apakšdirektoriju, izpildītjavac ca / javajeff / audio / *. java
vākt divus avota failusca / javajeff / audio
. Ja viss izdosies, jums vajadzētu atklātAudio.klase
unWavReader.class
failusaudio
apakšdirektorijs. (Alternatīvi, šajā piemērā varat pārslēgties uzaudio
apakšdirektoriju un izpildītjavac * .java
.)
Tagad, kad esat izveidojis audio bibliotēku, vēlaties to izmantot. Drīz mēs aplūkosim nelielu Java lietojumprogrammu, kas demonstrē šo bibliotēku. Pirmkārt, jums jāzina par importēšanas pārskatu.
Java ievades paziņojums
Iedomājieties, ka jums ir jānorāda ca.javajeff.grafika.Trīsstūris
katram gadījumam Trīsstūris
pirmkodā atkārtoti. Java nodrošina importa pārskatu kā ērtu alternatīvu, lai izlaistu garu informāciju par pakotni.
Importa paziņojums importē veidus no pakotnes, norādot kompilatoram, kur meklēt nekvalificēts (bez pakotnes prefiksa) tipa nosaukumi kompilēšanas laikā. Tas tiek parādīts netālu no avota faila augšdaļas, un tam jāatbilst šādai sintaksei:
importēt identifikators[.identifikators]*.(typeName | *);
Importa paziņojums sākas ar rezervētu vārdu importēt
un turpina ar identifikatoru, kam pēc izvēles seko identifikatoru secība, kas atdalīta ar periodu. Tipa nosaukums vai zvaigznīte (*
), un semikols izbeidz šo paziņojumu.
Sintakse atklāj divas importa paziņojuma formas. Pirmkārt, jūs varat importēt viena veida nosaukumu, kas tiek identificēts, izmantojot typeName
. Otrkārt, jūs varat importēt visus veidus, kas tiek identificēti, izmantojot zvaigznīti.
The *
simbols ir aizstājējzīme, kas apzīmē visus nekvalificētos tipu nosaukumus. Tas liek kompilatoram meklēt šādus nosaukumus importēšanas priekšraksta pakotņu secības labākajā pakotnē, ja vien tipa nosaukums nav atrodams iepriekš meklētajā paketē. Ņemiet vērā, ka, aizstājot aizstājējzīmi, netiek piemērots izpildes sods vai tas noved pie koda uzpūšanās. Tomēr tas var izraisīt nosaukumu konfliktus, kurus jūs redzēsiet.
Piemēram, importa ca.javajeff.grafika.Trīsstūris;
sastādītājam saka, ka nekvalificēts Trīsstūris
klase pastāv ca.javajeff.grafika
iepakojums. Līdzīgi kaut kas līdzīgs
importēt ca.javajeff.grafiku. *;
liek kompilatoram meklēt šo pakotni, kad tas sastopas ar Trīsstūris
nosaukums, a Aplis
vai pat Konts
nosaukums (ja Konts
vēl nav atrasts).
Izvairieties no * daudzu izstrādātāju projektos
Strādājot pie vairāku izstrādātāju projekta, izvairieties no *
aizstājējzīmi, lai citi izstrādātāji varētu viegli redzēt, kuri veidi tiek izmantoti jūsu pirmkodā.