1. Pakketten

Gewone Java-programma's omvatten een enorm aantal klassen. Hoeveel? Duizenden, tienduizenden. En als je er ook rekening mee houdt dat het programma verschillende bibliotheken gebruikt die klassen bevatten die door andere programmeurs zijn geschreven, dan kan het aantal klassen gemakkelijk in de miljoenen lopen!

Het zou bijna onmogelijk zijn om unieke namen te bedenken voor al deze miljoenen, of zelfs maar duizenden klassen.

Natuurlijk kunnen we namen als A123en bedenken B345, maar als we het hebben over het kiezen van een goede klassenaam, een die het gemakkelijker maakt om de klasse te begrijpen (zoals Stringvoor strings bijvoorbeeld), dan is zelfs het genereren van duizend unieke namen veel van werk.

Daarom is het in Java gebruikelijk om klassen in pakketten te groeperen met behulp van het sleutelwoord package.

Java-klassen en hun pakketten lijken sterk op bestanden en mappen op een computer.

Als u bijvoorbeeld 10 documenten op uw computer moet opslaan, bewaart u ze waarschijnlijk in één map. Maar wat als u duizenden documenten heeft (bijvoorbeeld een opslagplaats van alle documenten van een bedrijf)?

Met duizenden documenten die moeten worden opgeslagen, is een oplossing het maken van mappen op meerdere niveaus met goede beschrijvende namen. En sla vervolgens in een map op het allerlaatste niveau de documenten op die betrekking hebben op die specifieke map. Goede beschrijvende namen voor de documenten kunnen ook geen kwaad.

In feite doen we dit allemaal voor lessen in Java.

De bestanden die de klassen bevatten, worden opgeslagen in verschillende mappen (mappen), en de volledige naam van de map van de klas met al zijn submappen is de naam van het pakket. Voorbeeld:

Pad naar het bestand Verpakkingsnaam Naam van de klasse
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

In tegenstelling tot mapnamen gebruiken pakketnamen een punt als scheidingsteken. Met andere woorden, de map \com\codegym\tasks\komt overeen met het com.codegym.taskspakket.


2. srcmap

In Java is het gebruikelijk om alle klassen voor een programma op te slaan in een enkele map (en submappen). Deze map wordt meestal genoemd src(afkorting van source ).

Deze map wordt de projectroot (of source root ) genoemd en alle pakketpaden zijn relatief ten opzichte daarvan. Voorbeelden:

mappen Verpakkingsnaam
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

In deze situatie zeggen programmeurs zoiets als "we hebben een project met de naam my, dat zich in de map bevindt c:\projects\data" of "we hebben een project met de naam , dat zich in de map projectbevindt "d:\files\git\data

Het is het beste om klassen altijd in pakketten te plaatsen en niet rechtstreeks in de hoofdmap ( src. Als je maar een paar klassen hebt, is dit geen probleem. Maar als er veel klassen zijn, is het heel gemakkelijk om in de war te raken. Dus , maak je lessen altijd alleen in pakketten.

In Java is het gebruikelijk om betekenisvolle namen te geven aan klassen en pakketten. Veel bedrijven brengen hun eigen bibliotheken (een reeks klassen) uit en om verwarring te voorkomen, nemen ze de naam van het bedrijf/de website/het project op in de naam van het pakket:

Verpakkingsnaam Bedrijfs-/projectnaam
org.apache.common
org.apache.tomcat
org.apache.util
Apache-project
com.oracle.jdbc
Oracle-bedrijf
java.io
javax.servlet
Oracle-bedrijf, Java-project
com.ibm.websphere
IBM-bedrijf, WebSphere-project
com.jboss
JBoss-project

3. Bestandsinhoud

Volgens de Java-taalstandaard moet informatie over een klassenaam en de naam van het bijbehorende pakket worden opgenomen in het bestand met de code. Het algemene formulier wordt hieronder weergegeven:

package package-name;

public class ClassName
{

}

De pakketnaam moet overeenkomen met de mapnaam en de bestandsnaam moet overeenkomen met de naam van de openbare klasse.

Als je een bestand hebt, zou het dit moeten bevatten:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Klassen importeren

De klassenaam en pakketnaam vormen wat de volledig gekwalificeerde naam van de klasse wordt genoemd .

Voorbeelden:

Volledig gekwalificeerde naam Verpakkingsnaam Naam van de klasse
java.io.FileInputStream
java.io
FileInputStream
java.lang.String
java.lang
String
java.util.ArrayList
java.util
ArrayList
org.apache.tomcat.Servlet
org.apache.tomcat
Servlet
Cat
geen
Cat

Het goede nieuws:

De volledig gekwalificeerde klassenaam is altijd uniek binnen een project. U kunt tenslotte geen twee bestanden met dezelfde naam in één map maken.

Het slechte nieuws:

Volledig gekwalificeerde klassennamen zijn meestal lang of erg lang. En elke keer een lange naam schrijven (bijvoorbeeld java.util.ArrayList) in code is super onhandig.

Daarom heeft Java de mogelijkheid toegevoegd om klassen te importeren .

U kunt de korte naam van een klasse in uw code gebruiken , maar u moet eerst de compiler laten weten welke volledig gekwalificeerde klassenaam overeenkomt met de korte naam . Wat als je nu meerdere klassen met dezelfde naam in je project hebt? Of je hebt er oorspronkelijk een, maar er zijn er 15 bijgekomen...

Om een ​​korte klassenaam in uw code te gebruiken, moet u de volgende constructie toevoegen:

import fully-qualified-class-name;

Deze declaratie moet helemaal aan het begin van de les worden toegevoegd, direct na de packagedeclaratie.

Voorbeeld:

package com.codegym.tasks.task01;

import java.util.Scanner;
import com.test.helper.special.ArrayList;

public class Solution
{
   public static void main(String[] args)
   {
     Scanner console = new Scanner(System.in);
     ArrayList list = new ArrayList();
   }
}

We hebben twee klassen ( en ) geïmporteerd , zodat we hun korte namen in onze code kunnen gebruiken. En de compiler weet welke klassen hij moet gebruiken.java.util.Scannercom.test.helper.special.ArrayList

En hier is hoe dezelfde code eruit zou zien als we deze niet hadden gebruikt import:

package com.codegym.tasks.task01;

public class Solution
{
   public static void main(String[] args)
   {
     java.util.Scanner console = new java.util.Scanner(System.in);
     com.test.helper.special.ArrayList list = new com.test.helper.special.ArrayList();
   }
}

Trouwens, als uw project twee klassen heeft met de naam Scanner, kunt u ze niet allebei in hetzelfde bestand importeren: u zult de lange naam voor een van hen moeten gebruiken .

Laten we zeggen dat je een Jen in je team hebt. Er zijn geen communicatieproblemen, aangezien iedereen weet wie ze is. Maar als er drie Jens waren, dan zouden er volledig gekwalificeerde namen moeten worden gebruikt om ze te onderscheiden.

Notitie 1

Trouwens, als je te lui bent om veel importstatements aan je klas toe te voegen, kun je de luie versie gebruiken: plaats in plaats van een specifieke klassenaam een ​​sterretje:

import package-name.*;

Dat stelt u in staat om de korte namen van alle klassen in het pakket te gebruiken.

Opmerking 2

Alle klassen in het java.langpakket worden automatisch geïmporteerd, dus u hoeft importer geen statement voor te schrijven. Een van deze lessen ken je vast al: java.lang.String. Ja dat klopt. Dit is de Stringklasse die we hebben gebruikt voor het werken met strings.