Java/Package: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
→‎Importare le classi: ripulisco dalla roba che riguarda PATH e CLASSPATH
m →‎Archiviare le classi: ripulisco dalla roba riguardante PATH e CLASSPATH
Riga 47:
Il programmatore può assegnare una classe ad un suo package usando la parola chiave <tt>package</tt> seguita da un nome attribuitogli, caratterizzante l'insieme delle classi; con questa sintassi:
<source lang=java>package nomedelpackage;</source>
Questa istruzione deve essere la prima in assoluto del codice sorgente e inoltre il nome non deve cominciare con "java." poiché questo è riservato solo ai package standard della JDK.
Il nome del package dovrebbe essere indicativo delle caratteristiche della collezione delle classi.
Per archiviare la classe "HelloWorld". che abbiamo visto prima, in un package di nome "saluti" dobbiamo scrivere:
<source lang=java>package saluti;</source>
I package hanno un sistema di nomi strutturato.
 
I nomi del package devono avere una corrispondenza diretta nel filesystem: ad esempio, se si vuole archiviare il file helloWorld.class nella cartella “saluti” del file system, la cartella "saluti" dovrà essere presente, perché è qui che vogliamo conservare il file insieme ad altri dello stesso argomento e crearci la nostra collezione di classi.
 
Entra in gioco un percorso parziale che comincia dalla root e si interrompe al livello superiore più vicino alla directory del package, il percorso a monte della cartella “saluti”. Questo percorso è importante se vogliamo ritrovare poi le nostre classi. Questo percorso si chiama "CLASSPATH". "CLASSPATH" è anche il nome della variabile di sistema che va settata con il valore del percorso. Del CLASSPATH ne parliamo dopo.
 
La JVM per riutilizzare e ritrovare le classi, pur conoscendone il nome, non sa dove sono montate. La JVM sa che la classe HelloWorld è nella cartella “saluti” ma non sa dove è questa, sà mezzo percorso, quello del package, l'ultima parte dell'indirizzo assoluto. È necessario perciò che la prima parte dell'indirizzo deve essere già esistente sul disco fisso e ciò deve essere specificato anche al compilatore.
 
Ora poniamo che sia "/home/giovanni/mieclassi/", questo indirizzo lo dobbiamo specificare quando compiliamo le classi da archiviare, ed è questo il "CLASSPATH".
 
Si realizza con l'opzione "-d" di "javac" seguito dal CLASSPATH, in questo modo:
 
ripeto che l'indirizzo /home/giovanni/mieclassi/ deve già esistere realmente sul file system
 
<source lang=java>
javac -d /home/giovanni/mieclassi/ HelloWorld.java
</source>
 
Il compilatore leggerà nell'istruzione "package" il nome "saluti", creerà la directory e la accoderà. Automaticamente ci sarà /home/giovanni/mieclassi/saluti e lì metterà HelloWorld.class.
In questo caso è il compilatore che ha creato la cartella "saluti".
Non dobbiamo fare altro. Avremo archiviato la classe HelloWorld nel package saluti.
 
Questo indirizzo CLASSPATH dovrà essere lo stesso anche al momento della lettura delle classi, cosicché quando compiliamo un sorgente sia archiviando le classi e sia riusandole in lettura la JVM si riferirà alla medesima locazione di storage delle classi.
 
Il package può avere anche più directory. Con più directory cambia di poco: metteremo un punto “.” tra una directory e l'altra; la jvm cambierà automaticamente il punto nel carattere separatore del sistema operativo usato e la classe dovrà essere archiviata nell'ultima sottodirectory.
Line 106 ⟶ 84:
}
</source>
Se compilo ognuno di questi file con l'opzione "-d" del comando "javac", il compilatore appronterà sul disco la directory “saluti” con all'interno le cartelle “inghilterra”, “francia”, “italia”, tutte e tre queste cartelle sono allo stesso livello: sottodirectory di saluti.
 
Per comodità possiamo anche compilarle tutte in un colpo solo, a condizione che nella dir corrente vi sono solo questi tre file, con il comando
javac -d /home/giovanni/mieclassi/ *.java
Grazie al segno "*" asterisco, tutte e tre Le classi Helloworld saranno compilate e stoccate nei rispettivi packages.
 
Non cambia niente per la prima parte dell'indirizzo, il classpath, di cui parlavamo sopra che rimane invariato.
 
Se archivio con un package così: “packages saluti.italia.dialetto”, allora ci sarà la cartella dialetto come sottodirectory della cartella italia. All'interno di dialetto dovranno esserci i file corrispondenti dei saluti italiani in dialetto, ognuno con un diverso nome.