Programmēšana

Iepakojumi un statiskais imports Java valodā

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:

  1. Avota failā varat deklarēt tikai vienu pakotnes izrakstu.
  2. 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ēts publiski lai uz to varētu atsaukties ārpus tā paketes. Turklāt tas ir deklarēts galīgais lai to nevarētu paplašināt (tas nozīmē, apakšklasē).
  • Audio paziņo Privātsparaugi un sampleRate lauki audio datu glabāšanai. Šie lauki tiek inicializēti vērtībām, kas nodotas Audiokonstruktors.
  • Audioir paziņots konstruktors pakete-privāta (tas nozīmē, ka konstruktors nav deklarēts publiski, Privātsvai aizsargāts), lai šo klasi nevarētu izcelt ārpus tās paketes.
  • Audio dāvanas getSamples () un getSampleRate () audio klipa paraugu atgriešanas metodes un izlases biežums. Katra metode ir deklarēta publiski lai to varētu izsaukt no ārpuses Audioiepakojums.
  • Audio noslēdz ar a publiski un statisksnewAudio () rūpnīcas metode Audio objekts, kas atbilst faila nosaukums arguments. Ja audio klipu nevar iegūt, nulle tiek atgriezta.
  • newAudio () salīdzina faila nosaukumspaplašinājums ar .wav (šis piemērs atbalsta tikai WAV audio). Ja tie sakrīt, tas tiek izpildīts atgriezt WavReader.read (faila nosaukums) atgriezt Audio 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:

  1. Kā pašreizējo direktoriju faila sistēmā atlasiet piemērotu vietu.
  2. Izveidojiet a ca / javajeff / audio apakšdirektorija hierarhija pašreizējā direktorijā.
  3. Kopējiet 1. un 2. ierakstu failos Audio.java un WavReader.javaattiecīgi; un saglabājiet šos failus audio apakšdirektorijs.
  4. Pieņemot, ka pašreizējā direktorijā ir apm apakšdirektoriju, izpildīt javac ca / ​​javajeff / audio / *. java vākt divus avota failus ca / javajeff / audio. Ja viss izdosies, jums vajadzētu atklāt Audio.klase un WavReader.class failus audio apakšdirektorijs. (Alternatīvi, šajā piemērā varat pārslēgties uz audio apakšdirektoriju un izpildīt javac * .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ā.

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