Esercizi sulla Modularità in Java
Codegrind Team•Jul 12 2024
Ecco degli esercizi con soluzione per praticare la modularità in Java.
Esercizio 1: Creazione di un Modulo Semplice
Creare un semplice modulo in Java chiamato `com.esempio.modulo` con una classe che stampa un messaggio.
Struttura del Progetto:
moduli/
├── com.esempio.modulo/
│ ├── module-info.java
│ └── com/
│ └── esempio/
│ └── modulo/
│ └── Messaggio.java
module-info.java:
module com.esempio.modulo {
}
Messaggio.java:
package com.esempio.modulo;
public class Messaggio {
public void stampaMessaggio() {
System.out.println("Ciao dal modulo!");
}
}
Compilazione:
javac -d moduli/com.esempio.modulo moduli/com.esempio.modulo/module-info.java moduli/com.esempio.modulo/com/esempio/modulo/Messaggio.java
Esecuzione:
java --module-path moduli -m com.esempio.modulo/com.esempio.modulo.Messaggio
Esercizio 2: Esportazione di un Pacchetto
Esportare il pacchetto `com.esempio.modulo` in modo che possa essere utilizzato da altri moduli.
module-info.java:
module com.esempio.modulo {
exports com.esempio.modulo;
}
Esercizio 3: Utilizzo di un Modulo da un Altro Modulo
Creare un secondo modulo `com.esempio.app` che utilizza la classe `Messaggio` dal modulo `com.esempio.modulo`.
Struttura del Progetto:
moduli/
├── com.esempio.modulo/
│ ├── module-info.java
│ └── com/
│ └── esempio/
│ └── modulo/
│ └── Messaggio.java
├── com.esempio.app/
│ ├── module-info.java
│ └── com/
│ └── esempio/
│ └── app/
│ └── Main.java
module-info.java (com.esempio.modulo):
module com.esempio.modulo {
exports com.esempio.modulo;
}
module-info.java (com.esempio.app):
module com.esempio.app {
requires com.esempio.modulo;
}
Main.java:
package com.esempio.app;
import com.esempio.modulo.Messaggio;
public class Main {
public static void main(String[] args) {
Messaggio messaggio = new Messaggio();
messaggio.stampaMessaggio();
}
}
Compilazione:
javac -d moduli/com.esempio.modulo moduli/com.esempio.modulo/module-info.java moduli/com.esempio.modulo/com/esempio/modulo/Messaggio.java
javac --module-path moduli -d moduli/com.esempio.app moduli/com.esempio.app/module-info.java moduli/com.esempio.app/com/esempio/app/Main.java
Esecuzione:
java --module-path moduli -m com.esempio.app/com.esempio.app.Main
Esercizio 4: Fornire Implementazioni di un’Interfaccia
Creare un modulo `com.esempio.servizi` che fornisce un'implementazione di un'interfaccia `Servizio` e un modulo `com.esempio.client` che utilizza questa implementazione.
Struttura del Progetto:
moduli/
├── com.esempio.servizi/
│ ├── module-info.java
│ └── com/
│ └── esempio/
│ └── servizi/
│ ├── Servizio.java
│ └── ServizioImpl.java
├── com.esempio.client/
│ ├── module-info.java
│ └── com/
│ └── esempio/
│ └── client/
│ └── Main.java
module-info.java (com.esempio.servizi):
module com.esempio.servizi {
exports com.esempio.servizi;
}
Servizio.java:
package com.esempio.servizi;
public interface Servizio {
void esegui();
}
ServizioImpl.java:
package com.esempio.servizi;
public class ServizioImpl implements Servizio {
@Override
public void esegui() {
System.out.println("Servizio eseguito!");
}
}
module-info.java (com.esempio.client):
module com.esempio.client {
requires com.esempio.servizi;
}
Main.java:
package com.esempio.client;
import com.esempio.servizi.Servizio;
import com.esempio.servizi.ServizioImpl;
public class Main {
public static void main(String[] args) {
Servizio servizio = new ServizioImpl();
servizio.esegui();
}
}
Compilazione:
javac -d moduli/com.esempio.servizi moduli/com.esempio.servizi/module-info.java moduli/com.esempio.servizi/com/esempio/servizi/Servizio.java moduli/com.esempio.servizi/com/esempio/servizi/ServizioImpl.java
javac --module-path moduli -d moduli/com.esempio.client moduli/com.esempio.client/module-info.java moduli/com.esempio.client/com/esempio/client/Main.java
Esecuzione:
java --module-path moduli -m com.esempio.client/com.esempio.client.Main
Esercizio 5: Utilizzo di Servizi
Modificare l'esercizio precedente per utilizzare il meccanismo dei servizi Java (utilizzare `provides` e `uses`).
module-info.java (com.esempio.servizi):
module com.esempio.servizi {
exports com.esempio.servizi;
provides com.esempio.servizi.Servizio with com.esempio.servizi.ServizioImpl;
}
module-info.java (com.esempio.client):
module com.esempio.client {
requires com.esempio.servizi;
uses com.esempio.servizi.Servizio;
}
Main.java:
package com.esempio.client;
import com.esempio.servizi.Servizio;
import java.util.ServiceLoader;
public class Main {
public static void main(String[] args) {
ServiceLoader<Servizio> loader = ServiceLoader.load(Servizio.class);
for (Servizio servizio : loader) {
servizio.esegui();
}
}
}
Compilazione:
javac -d moduli/com.esempio.servizi moduli/com.esempio.servizi/module-info.java moduli/com.esempio.servizi/com/esempio/servizi/Servizio.java moduli/com.esempio.servizi/com/esempio/servizi/ServizioImpl.java
javac --module-path moduli -d moduli/com.esempio.client moduli/com.esempio.client/module-info.java moduli/com.esempio.client/com/esempio/client/Main.java
Esecuzione:
java --module-path moduli -m com.esempio.client/com.esempio.client.Main
Esercizio 6: Utilizzo di Risorse all’Interno di Moduli
Creare un modulo che legge un file di risorse (ad esempio, un file di proprietà) e stampa il suo contenuto.
Struttura del Progetto:
moduli/
├── com.esempio.risorse/
│ ├── module-info.java
│ ├── com/
│ │ └── esempio/
│ │ └── risorse/
│ │ └── LettoreRisorse.java
│ └── resources/
│ └── config.properties
module-info.java:
module com.esempio.r
isorse {
}
config.properties:
chiave1=valore1
chiave2=valore2
LettoreRisorse.java:
package com.esempio.risorse;
import java.io.InputStream;
import java.util.Properties;
public class LettoreRisorse {
public static void main(String[] args) {
try (InputStream input = LettoreRisorse.class.getResourceAsStream("/config.properties")) {
Properties prop = new Properties();
if (input == null) {
System.out.println("Spiacente, impossibile trovare config.properties");
return;
}
prop.load(input);
System.out.println("chiave1: " + prop.getProperty("chiave1"));
System.out.println("chiave2: " + prop.getProperty("chiave2"));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Compilazione:
javac -d moduli/com.esempio.risorse --module-source-path moduli `find moduli -name "*.java"`
Esecuzione:
java --module-path moduli -m com.esempio.risorse/com.esempio.risorse.LettoreRisorse
Esercizio 7: Modularizzazione di un’Applicazione con Dipendenze Esterne
Creare un modulo che utilizza una libreria esterna (ad esempio, la libreria JSON) e modularizzare l'applicazione.
Struttura del Progetto:
moduli/
├── com.esempio.jsonapp/
│ ├── module-info.java
│ └── com/
│ └── esempio/
│ └── jsonapp/
│ └── Main.java
libs/
└── org.json.jar
module-info.java:
module com.esempio.jsonapp {
requires org.json;
}
Main.java:
package com.esempio.jsonapp;
import org.json.JSONObject;
public class Main {
public static void main(String[] args) {
JSONObject json = new JSONObject();
json.put("nome", "Mario");
json.put("eta", 30);
System.out.println(json.toString());
}
}
Compilazione:
javac --module-path libs -d moduli/com.esempio.jsonapp moduli/com.esempio.jsonapp/module-info.java moduli/com.esempio.jsonapp/com/esempio/jsonapp/Main.java
Esecuzione:
java --module-path libs:moduli -m com.esempio.jsonapp/com.esempio.jsonapp.Main