back to top

Le interfacce in Java

Andiamo adesso ad analizzare l’ultimo dei concetti relativi alla programamzione ad oggetti, ovvero le interfacce.

Molto spesso le interfacce vengono confuse con le classi astratte dato che dal punto di vista logico sono molto simili, ma le interfacce possono essere intese come un’evoluzione delle classi astratte e permettono, di fatto, di simulare l’ereditarietà multipla. Il vantaggio principale di una interfaccia, essendo comunque una classe anche se con proprietà particolari, è quello che oltre ad essere estesa può essere implementata. La differenza tra estendere e implementare è molto grande in quanto una classe può essere eriditata solo ed esclusivamente una volta, mentre una classe può implementare infinite interfacce permettendo così l’ereditarietà multipla.

Per quanto riguarda l’interfacce, abbiamo alcune limitazioni rispetto ad una classe astratta, in quanto in una interfaccia possono essere dichiarati esclusivamente metodi astratti e non possono essere dichiarate variabili, ma solo costanti. Queste limitazioni non devono essere viste come una sorta di mancanza del java, in quanto risultano essere, in realtà, un altro punto di forza del linguaggio. Dato che con le interfacce si può simulare l’eredità multipla e potendo le interfacce solo dichiarare costanti e metodi astratti, avremo che l’ereditarietà multipla risultante sarà un’ereditarietà multipla controllata. Questo è un grosso vantaggio in quanto l’ereditarietà multipla selvaggia, ovvero il fatto di eredittarie da più classi, variabili e metodi già implementati, spesso è uno dei fattori principali che minano la robustezza dell’intera applicazione.

Vediamo adesso, dal punto di vista del codice, come si dichiara un’interfaccia e come la si implementa. La dichiarazione avviene usando la parola chiave interface in questo modo:

public interface Prova {
  //contenuto
}
L’implementazione dell’interfaccia è invece possibile utilizzando la parola chiave implements:
public class Implementazione implemets Prova {
  //contenuto
}
Per ottenre l’ereditarietà multipla basta accodare il nome delle interfacce che si vuole implementare dopo la parola chiave implements separate da virgola.

Le interfacce conferiscono ad un’applicazione uno dei concetti principali su cui si basa la programmazione ad oggetti: l’astrazione. Infatti, come abbiamo detto, l’astrazione consente di definire un concetto in maniera molto sintetica e focalizzando l’attenzione solo agli aspetti fondamentali che modellano un determinato concetto. Dunque cosa c’è di più astratto di un interfaccia nella quale non può essere implementato nessun metodo? Praticamente niente, dunque l’interfaccia risulta essere il massimo livello di astrazione possibile per i dati.

Purtroppo non è possibile comprendere al meglio la vera essenza delle interfacce fino a che non si ha a che fare con lo sviluppo di applicazioni di grandi dimensioni dove l’organizzazione delle classi e le varie relazioni di ereditarietà devono essere monitorare costantemente onde evitare la formazione di pericolosi bugs. Basti sapere che il Java sfrutta le interfacce per poter implementare uno dei suoi cavalli di battaglia: ovvero la creazione dei thread e quindi dare la caratteristica di multithreading all’applicazione. Senza le interfacce ciò non sarebbe stato possibile!

Il lettore potrà dunque vedere esempi più concreti per quanto riguarda l’uso delle interfacce quando tratteremo i Thread in questa guida.

Pubblicità