Liigu peamise sisu juurde

Paketid ja nimeruum

Sissejuhatus

Mida suuremaks projekt kasvab, seda keerulisemaks muutub kõigi klasside ühes kohas hoidmine ning projekti hallatavus väheneb. Paketid (packages) pakuvad viisi kuidas grupeerida kokku omavahel seotud klasse, sarnaselt sellele, kuidas arvuti failisüsteemis kaustad faile grupeerivad.

Lisaks struktuuri ja loetavuse parandamisele määravad paketid ka klasside nähtavuse piire. Package-private nähtavuse modifikaatoriga liikmed on kättesaadavad ainult sama paki sees, mistõttu on paketid olulised juurdepääsu kontrollimiseks ja kapseldamise tagamiseks.

Pakett

Pakett (package) on kogum omavahel seotud klassidest. Pakette deklareeritakse Java faili tipus package märksõnaga, näiteks:

package university.students;

public class Student {
// ...
}

Antud rida ütleb Java kompilaatorile, et klass Student kuulub university.students paketti. Paki nimi vastab failisüsteemi struktuurile, kus iga . tähendab uut kausta. Fail Student.java pakis university.students asub failisüsteemis aadressil src/university/students/Student.java.

Iga samas kaustas asuv Java fail peab deklareerima sama paketi. Kui koodis puudub package deklaratsioon, siis klass kuulub nii-öelda default package alla ehk nimetu paki alla. Seda muidugi tasuks vältida kuna nimetu pakiga klasse pole võimalik importida teistesse failidesse.

Nimeruum

Paketid lahendavad ka klasside nimetamise probleemi. Nimelt, Javas on võimalik luua kaks samanimelist klassi tingimusel, et need asetsevad erinevates pakkides. Seda mehhanismi nimetatakse nimeruumiks (namespace). - pakett määrab skoobi klassi nimedele ehk klassid university.students.Student ja school.records.Student on kaks täiesti erinevat klassi, olenemata sellest, et neil on sama nimi.

Ilma nimeruumita peaksid kõik klassinimed olema globaalselt unikaalsed, sealhulgas Java standardteegis ja kõigis kolmandate osapoolte teekides. Sellisel mastaabil nimede unikaalsust tagada on võimatu.

Näide nimekonfliktist

Vaatame konkreetset olukorda, kus kahel erineval klassil on sama nimi. Javas on kaks Date klassi, üks kuulub java.util ja teine java.sql pakki:

import java.util.Date;
import java.sql.Date;

Selline kood ei kompileeru, kuna kompilaator ei suuda otsustada, millist Date klassi täpsemalt kasutada soovitakse. Kui seejärel proovida kirjutada:

Date today = new Date();

tekiks kompileerimisviga, kuna nimi Date on mitmetähenduslik (ambiguous).

Antud olukorras tuleks kasutada ühe klassi puhul täielikku nime, näiteks:

import java.util.Date;

public class Example {

public static void main(String[] args) {
Date utilDate = new Date(); // java.util.Date
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
}
}
  • Date viitab konkreetselt java.util.Date klassile.
  • java.sql.Date kasutatakse täieliku nimega, et vältida segadust.

See näide illustreerib, kuidas paketid toimivad nimeruumina — sama nimega klassid võivad eksisteerida, kuid nende täielik nimi (koos paketiga) muudab need üheselt määratavaks.

Pakkide nimereeglid

Pakkide nimetamisel lähtu järgmistest tavadest:

  • Kõik peab olema läbivalt väikeste tähtedega kirjutatud.
  • Sõnasid eraldatakse punktidega (.), mitte kriipsudega.
  • Kokkuleppeliselt kasutatakse ettevõtte või organisatsiooni projektides pakkide nimetamisel ka domeeninime, et tagada unikaalsust. Näiteks org.apache.commons või ee.taltech.aurora
  • Isiklike projektide puhul võib piirduda ka lühikeste nimedega