Includere ed utilizzare librerie.
Obiettivi
- Libreria standard
- Librerie esterne
- Gson
- Javadoc
- Commenti in Java
Librerie
Le librerie sono dei pacchetti di codice che possono essere riutilizzati in più progetti.
Java ha una libreria standard molto ricca, ed è possibile includere innumerevoli librerie di terze parti.
Per includere una libreria esterna, è necessario scaricarla e aggiungerla al progetto. Per poter utilizzare le classi di una libreria, è necessario importarle all'interno del file.
import java.util.Scanner; // importa la classe Scanner del package java.util
import java.util.*; // importa tutte le classi del package java.util
Libreria standard
Java offre una libreria standard molto ricca, che include classi per la gestione di file, stringhe, numeri, strutture dati e molto altro.
Sarebbe impossibile mostrare tutte le classi disponibili, ma è possibile trovare una lista completa qui.
Esempi notevoli
java.util.ArrayList
: classe per la gestione di array dinamicijava.util.Scanner
: classe per la lettura di input da tastierajava.util.HashMap
: classe per la gestione di mappe chiave-valorejava.util.Random
: classe per la generazione di numeri casualijava.util.Date
: classe per la gestione di date e orarijava.io.FileReader
: classe per la lettura di file di testojava.io.BufferedReader
: classe per la lettura di stream di testo bufferizzati
Google è vostro amico
È impossibile conoscere a memoria tutte le utility offerte dalla libreria standard.
Piuttosto di fare lo sforzo inutile di ricordare centinaia di classi, memorizzate quelle che vi capiterà di usare più frequentemente e affidatevi a Google per il resto.
Librerie esterne
La maggior parte delle librerie esterne può essere trovata su Maven repository.
Ci sono molti modi per includere una libreria in un progetto, ma il più semplice è quello di scaricare il file .jar
e renderlo accessibile agli altri file sorgente.
Un file .jar
è un file compresso che contiene le classi di una libreria, il file MANIFEST.MF
e le risorse.
Struttura di un progetto
Sebbene non ci siano regole rigide, è buona norma organizzare il progetto in modo che sia chiaro dove si trovano le classi, le risorse e le librerie.
Questo è un possibile approccio:
.
├── lib # librerie esterne
├── out # file compilati
└── src # file sorgente
└── main
├── resources # risorse
│ └── META-INF
│ └── MANIFEST.MF
└── java
├── data # package
│ └── *.java
└── Main.java # entry point
Compilare
Affinché il compilatore possa trovare le classi di una libreria, è necessario specificare il percorso della cartella contenente il file .jar
.
javac -cp src:lib/* src/main/java/Main.java -d out
-cp (classpath)
: lista di percorsi da considerare per la ricerca delle classi, separate da ":
"-d
: percorso della cartella in cui posizionare l'output della compilazione
Esecuzione
Per eseguire il programma
java -cp <src folder>:<lib folder>/* <main class>
# Esempio
java -cp out:/lib/* main.java.Main <nome-file>
Produrre un file JAR
Per produrre un file JAR, è necessario creare un file MANIFEST.MF
contenente il nome della classe principale e il percorso delle librerie esterne.
Il percorso delle librerie esterne deve essere relativo alla cartella contenente il JAR prodotto.
Manifest-Version: 1.0
Main-Class: main.java.Main
Class-Path: ../lib/gson-2.10.1.jar
Il file JAR viene creato con il comando
jar cfm <nome-file>.jar <percorso-file-manifest> -C <percorso-cartella-classes> .
# Esempio
jar cfm out/JsonReader.jar src/main/resources/META-INF/MANIFEST.MF -C out .
Esecuzione del file JAR
Il comando per eseguire il JAR è
java -jar <nome-file>.jar <argomenti>
# Esempio
java -jar out/JsonReader.jar <nome-file>
Si noti che ciò continua a funzionare finché il percorso verso le librerie esterne, specificato nel MANIFEST, continua ad essere corretto in relazione al file JAR.
Considerazioni
Non sarebbe bello avere un tool che si occupa di gestire tutte le librerie esterne e il processo di compilazione?
Esempio
Applicazione in grado di leggere un file JSON con una struttura prestabilita e stampare a video i dati.
JSON
Il JavaScript Object Notation (JSON) è un formato di dati molto comune, utilizzato per lo scambio di informazioni tra applicazioni.
{
"users": [
{ "name": "John", "age": 30 },
{ "name": "Mary", "age": 28 }
],
"messages": [
{ "from": "John", "to": "Mary", "message": "Hi, how are you?" },
{ "from": "Mary", "to": "John", "message": "I'm fine, thanks!" }
]
}
Libreria Gson
La libreria Gson è una libreria realizzata da Google per la serializzazione e deserializzazione di oggetti Java in JSON.
Documentazione di Gson
Ogni qualvolta si utilizza una libreria esterna, è estremamente consigliato consultarne la documentazione ufficiale.
Quello che ci interessa è il metodo fromJson
della classe Gson
.
FileReader file = new FileReader("path/to/file");
BufferedReader reader = new BufferedReader(file);
Object json = new Gson().fromJson(reader, Object.class);
Utilizzare i record
Possiamo utilizzare dei record per costruire velocemente una trasposizione in Java delle informazioni contenute nel file JSON.
public record Message(String from, String to, String message) {}
public record User(String name, int age) {}
public record ApiResponse(User[] users, Message[] messages) {}
Utilizzando il metodo fromJson
di Gson
, possiamo ottenere un oggetto ApiResponse
contenente le informazioni del file JSON.
FileReader file = new FileReader("path/to/file");
BufferedReader reader = new BufferedReader(file);
ApiResponse json = new Gson().fromJson(reader, ApiResponse.class);
Documentazione
Documentare il proprio codice è fondamentale per la sua comprensione e manutenibilità, soprattutto nel momento in cui il proprio lavoro deve essere condiviso con altri.
Commenti
// Questo è un commento
/*
Questo è un commento
su più righe
*/
I commenti sono utili per spiegare il funzionamento di una porzione di codice. Non vengono considerati dal compilatore.
Javadoc
Un tool standard per la produzione della documentazione per il linguaggio java è Javadoc.
Oltre a poter essere usato per generare un sito web statico contenente la documentazione, i commenti Javadoc sono utilizzati dalla maggior parte degli IDE per fornire informazioni aggiuntive durante la scrittura del codice.
Commenti Javadoc
I commenti Javadoc seguono un formato standard che permette loro di essere utilizzati dal parser.
/**
* Questo è un commento Javadoc che descrive la classe, il metodo, etc...
*
* @param nomeParam1 descrizione del primo parametro
* @param nomeParam2 descrizione del secondo parametro
* @return descrizione del valore di ritorno
*/
Tag Javadoc
Tag più frequenti
- @author: classi e interfacce
- @version: classi e interfacce
- @param: metodi e costruttori
- @return: metodi
- @exception: (o @throws)
- @see
- @since
- @serial (o @serialfield, @serialdata)
- @deprecated
Esempio: Commento Javadoc
/**
* Returns an Image object that can then be painted on the screen.
* The url argument must specify an absolute <a href="#{@link}">{@link URL}</a>. The name
* argument is a specifier that is relative to the url argument.
* <p>
* This method always returns immediately, whether or not the
* image exists. When this applet attempts to draw the image on
* the screen, the data will be loaded. The graphics primitives
* that draw the image will incrementally paint on the screen.
*
* @param url an absolute URL giving the base location of the image
* @param name the location of the image, relative to the url argument
* @return the image at the specified URL
* @see Image
*/
public Image getImage(URL url, String name) {
try {
return getImage(new URL(url, name));
} catch (MalformedURLException e) {
return null;
}
}
Generare la documentazione
Per generare la documentazione, è necessario utilizzare il comando javadoc
fornito dal JDK.
javadoc -d <path/to/output/dir> <package o file>
Verrà generato un sito web statico contenente la documentazione.
Challenge
- Applicazione in grado di leggere più formati di file JSON, in base all'input dell'utente
- Applicazione in grado di leggere JSON ricevuti tramite una richiesta ad una REST API