📢 Nuovo Corso Laravel API disponibile!

Esercizi sulla Modularità in Java

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:

Terminal window
javac -d moduli/com.esempio.modulo moduli/com.esempio.modulo/module-info.java moduli/com.esempio.modulo/com/esempio/modulo/Messaggio.java

Esecuzione:

Terminal window
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:

Terminal window
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:

Terminal window
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:

Terminal window
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:

Terminal window
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:

Terminal window
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:

Terminal window
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:

Terminal window
javac -d moduli/com.esempio.risorse --module-source-path moduli `find moduli -name "*.java"`

Esecuzione:

Terminal window
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:

Terminal window
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:

Terminal window
java --module-path libs:moduli -m com.esempio.jsonapp/com.esempio.jsonapp.Main