Package in Java

Una cosa da evitare nella programmazione è l’ambiguità tra due elementi del codice. Il compilatore infatti non riesce a distinguere due funzioni o variabili con lo stesso nome, e quindi decide di non compilare un bel niente. Per questo motivo si consiglia di utilizzare sempre nomi distinti e pertinenti.

Cosa succede se però stiamo utilizzando una libreria scritta da qualche altra persona, dobbiamo forse analizzare tutto il loro codice alla ricerca di classi con nomi che abbiamo già usato? Assolutamente no, almeno non per i linguaggi moderni che usiamo noi!

Per risolvere questa problematica Java introduce i package, l’equivalente dei namespace di C++, che permettono di distinguere due elementi con lo stesso nome racchiudendoli in spazi diversi.

Usare un Package

Prendiamo per esempio il seguente codice:

//importo SimpleDateFormat dal package java.text
import java.text.SimpleDateFormat;

//importo Calendar dal package java.util
import java.util.Calendar;

class Main {

    public static void main(String[] args) {

        //Istanzio un oggetto Calendar per salvare una data

        Calendar data = Calendar.getInstance();

        data.set(Calendar.YEAR, 2000);
        data.set(Calendar.MONTH, Calendar.AUGUST);
        data.set(Calendar.DAY_OF_MONTH, 1);

        //Istanzio un oggetto SimpleDateFormat per stampare data secondo un formato specifico

        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

        System.out.println(dateFormat.format(data.getTime()));
    }
}

Per usare Calendar e SimpleDateFormat alle righe 13 e 21 dobbiamo importare i relativi file con la keyword import, lo facciamo alle righe 2 e 5. Di solito queste righe vengono aggiunte in automatico dall’IDE e noi non dobbiamo fare niente.

In alternativa all’import della singola classe, possiamo importare l’intero package con l’asterisco:

//Importo tutte le classi di java.text
import java.text.*;

//Importo tutte le classi di java.util
import java.util.*;

class Main {

    public static void main(String[] args) {

        Calendar data = Calendar.getInstance();

        data.set(Calendar.YEAR, 2000);
        data.set(Calendar.MONTH, Calendar.AUGUST);
        data.set(Calendar.DAY_OF_MONTH, 1);

        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

        System.out.println(dateFormat.format(data.getTime()));
    }
}

Definire un package

Per definire il nostro package dobbiamo usare la keyword package in cima al codice sorgente. In Java un singolo package è scritto in lettere minuscole e dev’essere fisicamente una cartella con all’interno le rispettive classi.

Per esempio il seguente file:

package immagini.raster;

class ImmagineJPG {

    //...
}

È definito nella seguente folder structure:

[Cartella del progetto]

├── immagini
│   │
│   ├── ...
│   └── raster
│       │
│       ├── ...
│       └── ImmagineJPG.java

└── ...

Dopo aver definito correttamente le cartelle dei package è possibile importare la nostra classe come tutte le altre:

import immagini.raster;