🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Esercizi sulla Modularità in Java

Codegrind TeamJul 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