类内的接口

在类内部,嵌套类和外部类之间使用接口有什么区别。

正如我在阅读有关问题和练习中的类DataStructure.java中的嵌套类 (在此处粘贴示例的片段):

 public class DataStructure { //some code interface DataStructureIterator extends java.util.Iterator { } // Inner class implements the DataStructureIterator interface, // which extends the Iterator interface private class EvenIterator implements DataStructureIterator { //rest code 
  1. 因此,关于显示的代码,界面中没有任何正文。 难道我不能用java.util.Iterator扩展EvenIterator类而不是创建这个接口并实现它吗?

  2. 在声明外部/内部干扰之间是否还有其他差异(除了代码可读性之外)?

  3. 当外部类通过接口扩展时会发生什么。 它会以任何方式影响嵌套类吗?

感谢您的时间,只是想确定如何正确使用它们。

  1. 因此,关于显示的代码,界面中没有任何正文。 难道我不能用java.util.Iterator扩展EvenIterator类而不是创建这个接口并实现它吗?

是的,你可以。 但这种方式可能更具可读性和可扩展性。 即使现在没有成员,也可以稍后添加。

  1. 在声明外部/内部干扰之间是否还有其他差异(除了代码可读性之外)?

嵌套接口是隐式静态的,因此唯一的影响是嵌套接口是封闭类命名空间的一部分。

因为类的成员可以声明为protectedprivate ,所以它也适用于嵌套接口。 但是,使用private接口很少有意义,因为它们只能在同一个类中实现,所以为什么首先要使用接口呢? 但是, protected接口可能很有用。 例如,您可能有一个抽象工厂方法,子类使用该方法向父类提供实例。 这是一个人为的例子:

 public abstract class Enclosing { protected interface JobHandler { void handle(Job job) throws JobException; } protected abstract JobHandler createJobHandler(); // public methods omitted private void doTheJob(Job job) { createJobHandler().handle(job); } } 

如果接口被声明为package-private,那么它也可能只是在包级别。 你可能想把它塞进一个类的唯一原因是因为它与类本身紧密耦合。 也许它是某种辅助接口,严格用于特定类的unit testing。

如果界面是public ,那么将它嵌套通常是个坏主意。 因为通过这样做,您可以增加接口和封闭类之间的耦合。 接口是减少耦合的最佳方法之一! 为什么要浪费他们的潜力?

假设您有一个具有Button类的mylib-buttons库。 有一天有一个Button.ClickListener似乎是个好主意。 然后,您希望在另一个类中重用此接口,甚至可能在另一个库中重用该接口。 但是,如果不对包含Button类的库引入(可能不必要的)依赖,则无法执行此操作。 另一方面,如果它是顶级接口,那么您只需将接口提取到另一个库中,例如mylib-core ,将杂乱的按钮单独留在mylib-buttons

接口内部的嵌套接口有点不同。 它们可以是同一设计的一部分,旨在一起使用。 @ cricket_007中的一条评论给出了一个很好的例子: Map.Entry

  1. 当外部类通过接口扩展时会发生什么。 它会以任何方式影响嵌套类吗?

这不是很清楚。 如何通过接口扩展类? 不过,无论你在这里指的是什么,如果考虑上述事实,你可以自己回答:嵌套接口只是类命名空间范围的一部分,就是这样。 没有任何其他影响。