Gli interface inner sono interfacce dichiarate all'interno di altre classi o interfacce. Sono apparse per la prima volta nel linguaggio per strutturare grandi classi e nascondere i dettagli di implementazione. Questa incapsulazione consente di raggruppare logicamente contratti, migliorando notevolmente la leggibilità e la manutenzione del codice.
Dalle prime versioni di Java è stata introdotta la possibilità di dichiarare interfacce inner statiche e non statiche all'interno di classi e altre interfacce. Questa prassi si è diffusa in grandi librerie (ad esempio, nelle collezioni di Java).
Una comprensione errata della visibilità e del campo di utilizzo delle interfacce inner porta spesso a errori nella progettazione delle API e a una maggiore complessità dell'architettura dell'applicazione. Non possono essere utilizzate come membri di istanza, sono sempre statiche nella loro natura.
Gli interface inner vengono utilizzati per fornire una struttura più modulare e per evidenziare contratti specifici relativi solo alla classe wrapper. Ad esempio, l'interfaccia Entry all'interno di Map:
public interface Map<K, V> { interface Entry<K, V> { K getKey(); V getValue(); } Set<Entry<K, V>> entrySet(); }
Caratteristiche chiave:
Domanda 1: È possibile creare un'istanza di un'interfaccia inner senza avere un'istanza della classe esterna?
Sì, un'istanza dell'interfaccia inner può essere implementata separatamente, senza creare un oggetto esterno, poiché l'interfaccia è statica.
Domanda 2: Qual è la visibilità dell'interfaccia inner all'interno della classe?
La visibilità è regolata dai modificatori (public, protected, private, package-private). Tuttavia, più spesso vengono rese public se è necessario l'accesso dall'esterno.
Domanda 3: Può un'interfaccia inner contenere interfacce inner?
Sì, è consentito qualsiasi grado di nidificazione delle interfacce, anche se nella pratica ciò si verifica raramente a causa della riduzione della leggibilità.
In un grande progetto sono state definite più di 10 interfacce inner all'interno della classe Service. Il numero di collegamenti è aumentato, rendendo più difficile la navigazione e la comprensione del codice.
Vantaggi:
Svantaggi:
Nella classe DataProcessor è stata definita un'interfaccia inner Validator, che è stata implementata solo all'interno di DataProcessor e non altrove.
Vantaggi:
Svantaggi: