Geneste interfaces (inner interfaces) zijn interfaces die binnen andere klassen of interfaces zijn gedeclareerd. Ze verschenen voor het eerst in de taal om grote klassen te structureren en implementatiedetails te verbergen. Deze encapsulatie maakt het mogelijk om contracten logisch te groeperen, wat de leesbaarheid en onderhoudbaarheid van de code aanzienlijk verbetert.
Sinds de eerste versies van Java is het mogelijk om statische en niet-statische geneste interfaces binnen klassen en andere interfaces te declareren. Deze praktijk is verspreid in grote bibliotheken (bijvoorbeeld in de Java-collecties).
Een verkeerd begrip van de zichtbaarheid en het gebruiksgebied van geneste interfaces leidt vaak tot ontwerpfouten in de API en complicaties in de architectuur van de applicatie. Ze kunnen niet gebruikt worden als leden van een instantie; ze zijn altijd statisch van aard.
Geneste interfaces worden gebruikt om een meer modulaire structuur te geven en specifieke contracten te выдел toegespitst op de wrapper-klasse. Bijvoorbeeld, de interface Entry binnen Map:
public interface Map<K, V> { interface Entry<K, V> { K getKey(); V getValue(); } Set<Entry<K, V>> entrySet(); }
Belangrijkste kenmerken:
Vraag 1: Kun je een instantie van een geneste interface creëren zonder een instantie van de buitenste klasse?
Ja, een instantie van een geneste interface kan apart worden geïmplementeerd, zonder een extern object te creëren, omdat de interface statisch is genest.
Vraag 2: Wat is het bereik van de geneste interface binnen de klasse?
Het bereik wordt geregeld door modifiers (public, protected, private, package-private). Vaak worden ze public gemaakt als toegang van buitenaf nodig is.
Vraag 3: Kan een geneste interface geneste interfaces bevatten?
Ja, elke mate van genesting van interfaces is toegestaan, hoewel dit in de praktijk zelden voorkomt vanwege vermindering van de leesbaarheid.
In een groot project werden meer dan 10 geneste interfaces binnen de klasse Service gedefinieerd. Het aantal relaties nam toe, waardoor navigatie en begrip van de code verslechterden.
Voordelen:
Nadelen:
In de klasse DataProcessor werd een geneste interface Validator gedefinieerd, die alleen binnen DataProcessor werd geïmplementeerd en nergens anders.
Voordelen:
Nadelen: