Interfacce Java

Last Updated on 2 anni | Published: 18/04/2024

Interfacce Java

Le interfacce sono un concetto fondamentale nella Programmazione Orientata agli Oggetti (OOP) in Java che permette di definire un contratto o un’interfaccia comune per un insieme di classi, promuovendo la modularità, l’estensibilità e la manutenibilità del codice.

Un‘ interfaccia in Java è una collezione di metodi astratti e costanti (variabili statiche final) che definisce un contratto o un’interfaccia comune per un insieme di classi.

Le interfacce permettono di specificare quali metodi devono essere implementati dalle classi che implementano l’interfaccia, senza fornire una implementazione concreta dei metodi stessi, infatti una interfaccia non può essere istanziata direttamente, ma una classe può implementare più interfacce.

Nel contesto della programmazione OOP, le interfacce sono utilizzate per definire un’interfaccia comune per un insieme di classi non correlate ma che condividono un comportamento o una funzionalità simile, promuovendo la modularità e il riutilizzo del codice.

Creare ed Implementare un' interfaccia

Per definire un’ interfaccia in Java, si utilizza la parola chiave interface seguita dal nome dell’interfaccia e dalla lista dei metodi non implementati e delle costanti. Ecco un esempio semplice di come potrebbe apparire un’interfaccia: 

public interface Veicolo {
        // Metodo astratto per accelerare
        void accelera();

        // Metodo astratto per frenare
        void frena();

        // Costante per la velocità massima
        int VELOCITA_MASSIMA = 200;
}

Per implementare un’interfaccia in una classe, si utilizza la parola chiave implements seguita dal nome dell’interfaccia. La classe deve fornire un’implementazione concreta dei metodi astratti definiti nell’interfaccia. Ecco un esempio di come potrebbe apparire una classe che implementa l’interfaccia Veicolo:

public class Auto implements Veicolo {
     @Override
     public void accelera() {
          System.out.println(“L’auto accelera.“);
     }

     @Override
     public void frena() {
          System.out.println(“L’auto frena.“);
     }
}

Iniezione delle Dipendenze

L’ iniezione delle dipendenze attraverso interfacce è una tecnica utilizzata per implementare il principio dell’inversione delle dipendenze (Dependency Inversion) nel design del software, che è uno dei principi fondamentali della programmazione orientata agli oggetti (OOP) e del design pattern.

L’ iniezione delle dipendenze attraverso interfacce permette di ridurre l’accoppiamento tra le classi e di promuovere la modularità, la flessibilità e la manutenibilità del codice, permettendo di sostituire facilmente le implementazioni concrete delle dipendenze senza modificare il codice esistente.

Un esempio molto semplice è quello di creare una interfaccia di IServizi ed una classe concreta Servizi che implementa i metodi:

// Definizione dell’interfaccia Servizio
public interface IServizi {
       void esegui();
}

// Implementazione del Servizio

public class Servizi implements IServizi {
       @Override
       public void esegui() {
              System.out.println(“Esegui ….“);
       }
}

ed una classe Clienti che dipende dai Servizi:

// Classe Client che dipende dall’interfaccia Servizio
public class Clienti {
       // Variabile di istanza di tipo Interfaccia
       private IServizi iservizi;

       // Costruttore con iniezione delle dipendenze
       public Clienti(IServizi iservizi) {
             this.iservizi= iservizi;
       }

        // Metodo che utilizza il servizio
       public void usaServizio() {
            iservizi.esegui();
       }
}

Possiamo quindi attraverso una classe di Test implementare il metodo main() per utilizzare il servizio:

// Metodo main per testare l’iniezione delle dipendenze attraverso interfacce

public class Test {
        public static void main(String[] args) {
              // Creazione di un oggetto Servizi
              IServizi servizio= new Servizi();

             // Creazione di un oggetto Client con iniezione delle dipendenze
             Clienti cliente = new Clienti(servizio);

             // Utilizzo del servizio attraverso il client
             cliente.eseguiServizio();
       }
}

Nel prossimo Articolo  parleremo del principio  dell’ ereditarietà in Java, principio fondamentale della OOP, che consente di creare nuove classi da quelle esistenti ………

LABORATORIO

Come ben sappiamo le interfacce contengono le firme dei metodi da implementare ma esse stesse non si possono istanziare, quindi le classi concrete implementano le interfacce, una o più, per poi implementare le firme importate. Un semplice esempio per Eclipse prospettiva SE:

Questo esercizio, da importare in Eclipse prosepettiva SE,  utilizza una interfaccia alcuni array primitivi e classi di sistema, implementa una logica per il lancio dei dadi, ovvero due concorrenti che lanciano i dadi cinque volte ciascuno, chi totalizza di più vince.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *