嵌套接口(inner interfaces)是声明在其他类或接口内部的接口。它们首次出现在语言中,用于结构化大型类和隐藏实现细节。这种封装允许逻辑上分组合同,大大提高代码的可读性和可维护性。
从 Java 的早期版本开始,就可以在类和其他接口内部声明静态和非静态的嵌套接口。这种实践在大型库中得到了推广(例如,在 Java 集合中)。
对嵌套接口的可见性和作用域的误解常常导致 API 设计错误和应用程序架构复杂化。它们不能作为实例的成员使用,因其本质上始终是静态的。
嵌套接口用于提供更模块化的结构和突出仅与外部类相关的特定合同。例如,Map 中的 Entry 接口:
public interface Map<K, V> { interface Entry<K, V> { K getKey(); V getValue(); } Set<Entry<K, V>> entrySet(); }
关键特性:
问题 1:可以在没有外部类实例的情况下创建嵌套接口的实例吗?
可以,嵌套接口的实例可以单独实现,而无需创建外部对象,因为该接口是静态嵌套的。
问题 2:嵌套接口在类中的可见性范围是什么?
可见性受修饰符(public、protected、private、package-private)的控制。然而,通常如果需要外部访问,它们会被设置为 public。
问题 3:嵌套接口可以包含嵌套接口吗?
是的,允许任意程度的接口嵌套,尽管在实践中由于降低可读性而很少见。
在一个大型项目中,在 Service 类内定义了 10 多个嵌套接口。关联数量增加,代码的导航和理解变得困难。
优点:
缺点:
在 DataProcessor 类中定义了仅在 DataProcessor 内部实现的嵌套接口 Validator,且在其他地方没有使用。
优点:
缺点: