LE INTERFACE IN JAVA
IMPLEMENTAZIONE MULTIPLA DELLE INTERFACE
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.
Dichiariamo la classe AClass che implementa entrambe le interface.
Scriviamo una seconda classe BClass che però implementa solo la seconda interface.
Andiamo a riepilogare con una figura quanto scritto finora.
Creiamo la classe di test.
Non avremmo potuto fare altrettanto con BClass in quanto non implementa l’interfaccia IMyInterface1.
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.
EREDITARIETA’ TRA INTERFACE
Le interface come le classi supportano la specializzazione. Vediamo un esempio.
La classe che implementa IMyInterface2 deve implementare myMethod1() e myMethod2().
Vediamo la classe di test.
La figura riepiloga il codice riportato.
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.
Vediamo la classe che la implementa.
La figura riporta la classe di test.
Nulla ci impedisce di eseguire l’override del metodo di default inserendo una versione specifica all’interno della classe che la implementa.
Verrà eseguito il metodo in override definito in AClass. Volendo possiamo invocare anche il metodo di default definito nella interface. Vediamo come.
Verranno eseguite entrambe le versioni, sia quella definita nella classe che quella definita nella interface.
INTERFACE E EREDITARIETA’ MULTIPLA
L’introduzione dei metodi di default nelle interface porta con sé un potenziale problema. Cerchiamo di capirlo attraverso degli esempi.
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.
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.
Si può infine ricorrere all’utilizzo di super() per eseguire anche il metodo definito in IMyInterface1.
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.
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.
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.
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.
Le Annotations derivano tutte da questa interface. Vediamo come si dichiara una Annotation.
I metodi vengono detti elementi della annotazione. Sulla base del numero di elementi abbiamo tre differenti 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.
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.
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
LINK AL CODICE SU 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.
Scrivi un commento