# Package (Java)

Un package è un meccanismo per organizzare classi Java in gruppi logici, principalmente (ma non solo) allo scopo di definire namespace distinti per diversi contesti. Il package ha lo scopo di riunire classi (o entità analoghe, quali interfacce ed enumerazioni) logicamente correlate. Per esempio, le librerie standard Java sono organizzate in un sistema di package che comprende per esempio elementi strutturali del linguaggio servizi di rete e così via.

## Effetti dell'uso dei package

Un package definisce un namespace per le entità di primo livello gerarchico del linguaggio Java, ovvero classi, interfacce, tipi enumerati, e annotazioni. Il nome completamente qualificato (FQN, fully qualified name) di un'entità di primo livello comprende il nome del package come prefisso. Per esempio, la classe File appartenente al package java.io ha FQN java.io.File. Due classi Java possono essere omonime, a patto che abbiano FQN distinti. Per esempio, le librerie standard Java contengono due diverse classi chiamate Node, una che rappresenta nodi di un documento SOAP (con FQN javax.xml.soap) e una che rappresenta nodi di un documento nel modello DOM di W3C (con FQN org.w3c.dom). All'interno di un determinato package, è possibile riferirsi a un'entità usando il nome semplice; il ricorso all'FQN diventa necessario quando ci si riferisce a entità appartenenti ad altri package o in caso di ambiguità.
Oltre a svolgere questa funzione di namespace, il package Java ha anche un ruolo nel contesto dei meccanismi di information hiding del linguaggio. In particolare, una classe può accedere a tutti i membri non privati delle altre classi appartenenti allo stesso package, mentre è soggetta a maggiori restrizioni nei confronti di classi appartenenti a package diversi.

## Uso dei package

Nei file sorgente di Java, il package a cui appartiene il file è specificato con l'istruzione package:
In generale, classi appartenenti ad altri package dovranno riferirsi alla classe con il FQN. Come semplificazione, è possibile usare una speciale clausola import per indicare al compilatore di ricavare automaticamente il FQN di determinate classi o di classi appartenenti a determinati package. Per esempio, usando la clausola
sarà possibile riferirsi alla classe javax.xml.soap.Node col nome semplice non qualificato (Node), demandando al compilatore di espanderlo sulla base dell'import, laddove sia possibile.

## Protezione di accesso dei package

Le classi appartenenti a un package possono accedere altre classi e in generale membri con accesso default e membri con accesso protected. L'accesso default rappresenta il comportamento generale, che si ha quando non viene specificato nessun modificatore d'accesso durante la dichiarazione del membro. Al contrario, classi contenute in altri package non possono accedere a classi o membri con accesso default. I membri protected possono invece essere usati da classi in altri package che siano state dichiarate sottoclassi della classe in questione.

## Convenzioni sui nomi dei package

I package sono di solito definiti usando una struttura gerarchica, indicando i livelli di gerarchia con dei punti. Anche se i package più in basso nella gerarchia sono spesso chiamati sotto-package di altri package, non c'è nessuna relazione semantica. Il documento Java Language Specification stabilisce le convenzioni da adottare nei nomi dei package, così da evitare di pubblicarne due con lo stesso nome. Le convenzioni descrivono come creare nomi unici, in modo da assicurare che package di uso generale e di larga distribuzione non abbiano nomi che possano generare ambiguità.
In generale, un nome comincia con il dominio di primo livello dell'organizzazione che lo produce, seguito dal dominio e da altri eventuali sottodomini, elencati in ordine inverso. L'organizzazione può infine scegliere un nome specifico per quel particolare package. Inoltre, sempre per convenzione, i nomi dei package dovrebbero contenere solo lettere minuscole.
Per esempio, se un'organizzazione canadese chiamata MySoft crea un package che si occupa di frazioni, chiamare il package ca.mysoft.fractions lo distingue da un altro package simile creato da un'altra compagnia. Infatti se una compagnia statunitense omonima crea un package sulle frazioni, ma lo chiama com.mysoft.fractions, le classi nei due package saranno tutte definite in namespace separati e unici.
Altre convenzioni per evitare le ambiguità e regole per dare nomi ai package quando in dominio Internet non può essere direttamente usato nel nome sono descritte nella sezione 7.7 della Java Language Specification.

## Package di base contenuti nella J2SE 6.0

Questa lista include i package di base contenuti nella versione 6.0 della Java Platform, Standard Edition.
| java.lang | - funzionalità di base del linguaggio e tipi di dato fondamentali |
| java.util | - classi di collezione (strutture dati) |
| java.io | - operazioni su file |
| java.math | - aritmetica multiprecisione |
| java.nio | - il nuovo framework I/O per Java |
| java.net | - operazioni di rete, socket, ricerca DNS, ... |
| java.security | - generazione di chiavi crittografiche, sicurezza e crittografia |
| java.sql | - Java DataBase Connectivity (JDBC) per facilitare l'accesso a database |
| java.awt | - struttura di base per componenti Graphical User Interface (GUI) |
| javax.swing | - struttura avanzata e indipendente dalla piattaforma per componenti GUI |