LE INTERFACE IN JAVA

IMPLEMENTAZIONE MULTIPLA DELLE INTERFACE

java-logo

In questa seconda parte un pò più corposa del solito termineremo il discorso interface analizzando gli aspetti mancanti. Vediamo con un esempio un po’ più articolato i vantaggi nell’uso delle interface. Introduciamo due interfacce.

Interface

Dichiariamo la classe AClass che implementa entrambe le interface.

Classi

Scriviamo una seconda classe BClass che però implementa solo la seconda interface.

Seconda classe

Andiamo a riepilogare con una figura quanto scritto finora.

Riepilogo

Creiamo la classe di test.

Classe di test

Non avremmo potuto fare altrettanto con BClass in quanto non implementa l’interfaccia IMyInterface1.

Classe di test

Quello che vedi nella classe di test è un esempio di polimorfismo. Tenendo presente che le classi AClass e BClass avrebbero potuto appartenere a gerarchie di generalizzazione differenti (ereditarietà) a questo punto possiamo capire che l’utilizzo delle interface rende l’applicazione del polimorfismo molto più trasversale.

Classe di test

EREDITARIETA’ TRA INTERFACE

Le interface come le classi supportano la specializzazione. Vediamo un esempio.

Ereditarieta tra interface

La classe che implementa IMyInterface2 deve implementare myMethod1() e myMethod2().

Implementazione

Vediamo la classe di test.

Classe di test

La figura riepiloga il codice riportato.

Classe di test

METODI DI DEFAULT NELLE INTERFACE

Le interface nel loro utilizzo più comune sono contenitori di metodi astratti. A partire dalla versione otto, Java implementa metodi di default nelle interface, introducendo tali metodi alcuni di essi diventano opzionali nelle classi che le implementano. Chi progetta la classe può decidere per proprio conto di non implementare alcuni metodi, già definiti nella interface, e di usare la versione già presente senza eseguirne l’override.

Metodi di default

Vediamo la classe che la implementa.

Implementazione con metodi di default

La figura riporta la classe di test.

Test

Nulla ci impedisce di eseguire l’override del metodo di default inserendo una versione specifica all’interno della classe che la implementa.

Override metodo di default
Test

Verrà eseguito il metodo in override definito in AClass. Volendo possiamo invocare anche il metodo di default definito nella interface. Vediamo come.

Invocazione metodo di default

Verranno eseguite entrambe le versioni, sia quella definita nella classe che quella definita nella interface.

Invocazione entrambi metodi

INTERFACE E EREDITARIETA’ MULTIPLA

L’introduzione dei metodi di default nelle interface porta con sé un potenziale problema. Cerchiamo di capirlo attraverso degli esempi.

Problema ereditarietà multipla

Se adesso andiamo a dichiarare una classe che di fatto implementa entrambe le interface siamo nei guai, infatti verrà generato un errore dal compilatore. Per risolvere il problema dobbiamo eseguire l’override nella classe che implementa le interfacce.

Override

Vediamo un altro caso in cui il compilatore detta una regola e la esegue. In pratica l’interfaccia che eredita ha la meglio sulla interface ereditata; quindi, verrà utilizzato il metodo presente in IMyInterface2.

Ereditarieta

Si può infine ricorrere all’utilizzo di super() per eseguire anche il metodo definito in IMyInterface1.

super

METODI PRIVATI E STATICI IN UNA INTERFACE

Il metodo privato è disponibile solo all’interno della interface, non può in alcun modo essere usato nelle classi che la implementano.

Metodi privati

Gli unici metodi che possono usare un metodo privato sono i metodi di default. A cosa servono? Diciamo che con l’introduzione dei metodi di default e quindi di logica applicativa, diventa ovvio scomporre parte della logica applicativa in metodi più semplici e riutilizzabili. Veniamo ai metodi statici.

Metodi statici

La stessa cosa vista per i metodi statici delle classi, vale anche per i metodi statici delle interface, non sono metodi di istanza ma metodi che appartengono alla interface. Vediamo come si invocano.

Invocazione metodo statico

INTRODUZIONE ALLE ANNOTATIONS

Le annotazioni sono un meccanismo mediante il quale è possibile fornire dei metadati che poi saranno interpretati dai tool e dal compilatore Java stesso. Vediamo adesso di definire i metadati. Prendiamo una fotografia digitale. L’informazione principale su cui siamo maggiormente interessati è l’immagine stessa che riporta un fiore, ci sono tuttavia altre informazioni a corredo, informazioni su questa foto che si chiamano metadati, come la data e l’ora dello scatto, la marco e il modello della macchina fotografica usata, le informazioni di copyright etc. I metadati se corredati da uno standard possono essere gestiti da tool per motivi particolari. Le Annotation sono un particolare tipo di interface. Hanno anch’esse dei metadati a corredo e vengono impiegate in vari punti del nostro software da dei tool e dal compilatore stesso per eseguire attività e controlli particolari.

Metadati

Le Annotations derivano tutte da questa interface. Vediamo come si dichiara una Annotation.

Annotations
Dichiarazione di annotation

I metodi vengono detti elementi della annotazione. Sulla base del numero di elementi abbiamo tre differenti categorie.

Categorie

Le Annotation che non hanno nessun elemento sono le Marker Annotation, lo scopo è marcare la loro presenza in un certo punto del nostro codice. Quando l’annotazione ha un solo elemento viene detta Single-Value Annotation, se ha più elementi Multi-Value Annotation. Vediamo un esempio.

Esempio di annotazione

Gli elementi vengono inizializzati con dei valori come se fossero attributi, valori poi usati dai tool o dal compilatore. Vediamo una Marker Annotation di default che Java ci offre e che il compilatore utilizza.

Annotations Override

Se noi andiamo ad annotare un metodo in questo modo cioè con @Override stiamo dicendo al compilatore che andiamo a fare l’override di un metodo presente in una superclasse, se però andiamo a modificare il nome del metodo il compilatore produce un errore dovuto alla marker Annotation. Questo ci garantisce di scrivere i nostri programmi in modo più sicuro e controllato.

LINK AI POST PRECEDENTI

IL LINGUAGGIO JAVA

LINK AL CODICE SU GITHUB

GITHUB

ESECUZIONE DEL CODICE DI ESEMPIO

  • Scaricare il codice da GITHUB, lanciare il file JAR con il seguente comando in Visual Studio Code, posizionandosi nella directory contenente il JAR.

        java -jar –enable-preview CorsoJava.jar

  • Oppure mettere in esecuzione il main che si trova nel file CorsoJava.java.