类内的接口

时间:2016-04-10 12:58:44

标签: java class interface

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

当我正在阅读Oracle中DataStructure.java中的课程Questions and Exercises: Nested Classes时(在此处粘贴示例片段):

public class DataStructure {
//some code
    interface DataStructureIterator extends java.util.Iterator<Integer> { } 

    // Inner class implements the DataStructureIterator interface,
    // which extends the Iterator<Integer> interface

    private class EvenIterator implements DataStructureIterator {
//rest code
  1. 因此,关于节目的代码,界面中没有任何正文。我不能用java.util.Iterator<Integer>扩展EvenIterator类而不是创建这个接口并实现它吗?

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

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

  4. 只是想确定这些事情,以便知道如何正确使用它们,感谢您的时间。

1 个答案:

答案 0 :(得分:1)

  
      
  1. 因此,关于节目的代码,界面中没有任何正文。我不能只扩展EvenIterator类   java.util.Iterator而不是创建此接口和   实现它?
  2.   

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

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

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

因为类的成员可以声明为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,那么它也可能只是在包级别。你可能想把它塞进一个类的唯一原因是因为它与类本身紧密耦合。也许它是某种辅助接口,严格用于特定类的单元测试。

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

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

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

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

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