1. Pacchetti

I normali programmi Java coinvolgono un numero enorme di classi. Quanti? Migliaia, decine di migliaia. E se si tiene conto anche del fatto che il programma utilizza varie librerie contenenti classi scritte da altri programmatori, allora il numero di classi può essere facilmente misurato in milioni!

Sarebbe quasi impossibile trovare nomi univoci per tutti questi milioni, o anche solo migliaia, di classi.

Certo, possiamo immaginare nomi come A123e B345, ma se stiamo parlando di scegliere un buon nome di classe, uno che semplifichi la comprensione della classe (come Stringper le stringhe, per esempio), allora anche generare un migliaio di nomi univoci è molto di lavoro.

Ecco perché in Java è consuetudine raggruppare le classi in pacchetti utilizzando la parola chiave package.

Le classi Java ei relativi pacchetti sono molto simili a file e cartelle su un computer.

Ad esempio, se hai bisogno di archiviare 10 documenti sul tuo computer, probabilmente li conserveresti in un'unica cartella. Ma cosa succede se si dispone di migliaia di documenti (ad esempio, un archivio di tutti i documenti di un'azienda)?

Con migliaia di documenti da archiviare, una soluzione è creare più livelli di cartelle con buoni nomi descrittivi. E poi in una cartella all'ultimo livello, archivia i documenti relativi a quella particolare cartella. Anche i buoni nomi descrittivi per i documenti non fanno male.

In effetti, facciamo tutto questo per le classi in Java.

I file contenenti le classi sono archiviati in diverse directory (cartelle) e il nome completo della cartella della classe con tutte le sue sottocartelle è il nome del pacchetto. Esempio:

Percorso del file Nome del pacchetto Nome della classe
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

A differenza dei nomi delle cartelle, i nomi dei pacchetti utilizzano un punto come delimitatore. In altre parole, la cartella \com\codegym\tasks\corrisponde al com.codegym.taskspacchetto.


2. srccartella

In Java, è consuetudine archiviare tutte le classi per un programma in una singola cartella (e sottocartelle). Questa cartella è solitamente chiamata src(abbreviazione di source ).

Questa cartella è chiamata project root (o source root ) e tutti i percorsi dei pacchetti sono relativi ad essa. Esempi:

Cartelle Nome del pacchetto
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

In questa situazione, i programmatori dicono qualcosa come "abbiamo un progetto chiamato my, che si trova nella c:\projects\datacartella" o "abbiamo un progetto chiamato project, che si trova nella d:\files\git\datacartella"

È meglio mettere sempre le classi nei pacchetti e non direttamente nella cartella principale ( src. Se hai solo poche classi, questo non rappresenta un problema. Ma quando ci sono molte classi, è molto facile confondersi. Quindi , crea sempre le tue classi solo nei pacchetti.

In Java, è consuetudine assegnare nomi significativi a classi e pacchetti. Molte aziende rilasciano le proprie librerie (un insieme di classi) e, per evitare confusione, incorporano il nome dell'azienda/sito web/progetto nel nome del pacchetto:

Nome del pacchetto Nome azienda/progetto
org.apache.common
org.apache.tomcat
org.apache.util
Progetto Apache
com.oracle.jdbc
Società Oracle
java.io
javax.servlet
Società Oracle, progetto Java
com.ibm.websphere
Società IBM, progetto WebSphere
com.jboss
Progetto JBoss

3. Contenuto del file

Secondo lo standard del linguaggio Java, le informazioni sul nome di una classe e sul nome del suo pacchetto devono essere incluse nel file con il codice. La forma generale è mostrata di seguito:

package package-name;

public class ClassName
{

}

Il nome del pacchetto deve corrispondere al nome della cartella e il nome del file deve corrispondere al nome della classe pubblica.

Se hai un file, allora dovrebbe contenere questo:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Importazione di classi

Il nome della classe e il nome del pacchetto formano quello che viene chiamato il nome completo della classe .

Esempi:

Nome completo Nome del pacchetto Nome della classe
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
nessuno
Cat

Le buone notizie:

Il nome completo della classe è sempre univoco all'interno di un progetto. Dopotutto, non puoi creare due file con lo stesso nome in una singola cartella.

La cattiva notizia:

I nomi di classe completi sono in genere lunghi o molto lunghi. E scrivere un nome lungo (ad esempio java.util.ArrayList) ogni volta nel codice è super scomodo.

Ecco perché Java ha aggiunto la possibilità di importare classi .

Puoi usare il nome breve di una classe nel tuo codice, ma devi prima far sapere al compilatore quale nome di classe completo corrisponde al nome breve . Cosa succede se ora hai più classi con lo stesso nome nel tuo progetto? Oppure ne hai originariamente uno, ma poi ne sono stati aggiunti altri 15...

Per utilizzare un nome di classe breve nel codice, è necessario aggiungere il seguente costrutto:

import fully-qualified-class-name;

Questa dichiarazione deve essere aggiunta all'inizio della classe, subito dopo la packagedichiarazione.

Esempio:

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();
   }
}

Abbiamo importato due classi ( java.util.Scannere com.test.helper.special.ArrayList), quindi possiamo usare i loro nomi brevi nel nostro codice. E il compilatore saprà quali classi usare.

Ed ecco come sarebbe lo stesso codice se non avessimo usato 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();
   }
}

A proposito, se il tuo progetto ha due classi denominate Scanner, non sarai in grado di importarle entrambe nello stesso file: dovrai usare il nome lungo per una di esse.

Diciamo che hai una Jen nella tua squadra. Non ci sono problemi di comunicazione, poiché tutti sanno chi è. Ma se ci fossero tre Jen, dovrebbero essere usati nomi completi per distinguerli.

Nota 1

A proposito, se sei troppo pigro per aggiungere molte istruzioni di importazione alla tua classe, puoi usare la sua versione pigra: invece di un nome di classe specifico, metti un asterisco:

import package-name.*;

Ciò ti consentirà di utilizzare i nomi brevi di tutte le classi nel pacchetto.

Nota 2

Tutte le classi nel java.langpacchetto vengono importate automaticamente, quindi non è necessario scrivere un'istruzione importper esse. Sei sicuro di conoscere già una di queste classi: java.lang.String. Sì, è giusto. Questa è la Stringclasse che abbiamo usato per lavorare con le stringhe.