使用类内部接口,嵌套类和外部类之间的区别是什么。
当我正在阅读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
因此,关于节目的代码,界面中没有任何正文。我不能用java.util.Iterator<Integer>
扩展EvenIterator类而不是创建这个接口并实现它吗?
在声明外部/内部干扰之间是否存在其他差异(代码可读性除外)?
当外部类通过接口扩展时会发生什么。它会以任何方式影响嵌套类吗?
只是想确定这些事情,以便知道如何正确使用它们,感谢您的时间。
答案 0 :(得分:1)
- 因此,关于节目的代码,界面中没有任何正文。我不能只扩展EvenIterator类 java.util.Iterator而不是创建此接口和 实现它?
醇>
是的,你可以。但这种方式可能更具可读性和可扩展性。即使现在没有成员,也可以稍后添加。
- 在声明外部/内部干扰之间是否存在其他差异(除了代码可读性之外)?
醇>
嵌套接口是隐式静态的,因此唯一的影响是嵌套接口是封闭类命名空间的一部分。
因为类的成员可以声明为protected
或private
,所以它也适用于嵌套接口。但是,使用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
。
- 当外部类通过接口扩展时会发生什么。它会以任何方式影响嵌套类吗?
醇>
这不是很清楚。如何通过接口扩展类?然而,无论你在这里指的是什么,如果考虑上述事实,你可以自己回答:嵌套接口只是类命名空间范围的一部分,就是这样。没有任何其他影响。