Las interfaces anidadas (inner interfaces) son interfaces declaradas dentro de otras clases o interfaces. Aparecieron por primera vez en el lenguaje para estructurar clases grandes y ocultar detalles de implementación. Este encapsulamiento permite agrupar lógicamente contratos, mejorando notablemente la legibilidad y el mantenimiento del código.
Desde las primeras versiones de Java, se introdujo la posibilidad de declarar interfaces anidadas estáticas y no estáticas dentro de clases y otras interfaces. Esta práctica se ha extendido en grandes bibliotecas (por ejemplo, en colecciones de Java).
Una comprensión incorrecta de la visibilidad y el ámbito de uso de las interfaces anidadas a menudo conduce a errores de diseño de API y complica la arquitectura de la aplicación. No se pueden usar como miembros de instancia; siempre son estáticas por su naturaleza.
Las interfaces anidadas se utilizan para proporcionar una estructura más modular y destacar contratos específicos que solo se relacionan con la clase envolvente. Por ejemplo, la interfaz Entry dentro de Map:
public interface Map<K, V> { interface Entry<K, V> { K getKey(); V getValue(); } Set<Entry<K, V>> entrySet(); }
Características clave:
Pregunta 1: ¿Se puede crear una instancia de una interfaz anidada sin tener una instancia de la clase externa?
Sí, se puede implementar una instancia de la interfaz anidada por separado, sin crear un objeto externo, ya que la interfaz está anidada de forma estática.
Pregunta 2: ¿Cuál es el ámbito de visibilidad de la interfaz anidada dentro de la clase?
El ámbito de visibilidad está regulado por modificadores (public, protected, private, package-private). Sin embargo, a menudo se hacen public si se necesita acceso externo.
Pregunta 3: ¿Puede una interfaz anidada contener interfaces anidadas?
Sí, se permite cualquier grado de anidación de interfaces, aunque en la práctica esto es poco común debido a la disminución de la legibilidad.
En un gran proyecto, se definieron más de 10 interfaces anidadas dentro de la clase Service. El número de relaciones creció, y la navegación y comprensión del código empeoraron.
Ventajas:
Inconvenientes:
En la clase DataProcessor, se definió la interfaz anidada Validator, que solo se implementó dentro de DataProcessor y en ninguna otra parte.
Ventajas:
Inconvenientes: