类内的接口
在类内部,嵌套类和外部类之间使用接口有什么区别。
正如我在阅读有关问题和练习中的类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
-
因此,关于显示的代码,界面中没有任何正文。 难道我不能用
java.util.Iterator
扩展EvenIterator类而不是创建这个接口并实现它吗? -
在声明外部/内部干扰之间是否还有其他差异(除了代码可读性之外)?
-
当外部类通过接口扩展时会发生什么。 它会以任何方式影响嵌套类吗?
感谢您的时间,只是想确定如何正确使用它们。
- 因此,关于显示的代码,界面中没有任何正文。 难道我不能用java.util.Iterator扩展EvenIterator类而不是创建这个接口并实现它吗?
是的,你可以。 但这种方式可能更具可读性和可扩展性。 即使现在没有成员,也可以稍后添加。
- 在声明外部/内部干扰之间是否还有其他差异(除了代码可读性之外)?
嵌套接口是隐式静态的,因此唯一的影响是嵌套接口是封闭类命名空间的一部分。
因为类的成员可以声明为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,那么它也可能只是在包级别。 你可能想把它塞进一个类的唯一原因是因为它与类本身紧密耦合。 也许它是某种辅助接口,严格用于特定类的unit testing。
如果界面是public
,那么将它嵌套通常是个坏主意。 因为通过这样做,您可以增加接口和封闭类之间的耦合。 接口是减少耦合的最佳方法之一! 为什么要浪费他们的潜力?
假设您有一个具有Button
类的mylib-buttons
库。 有一天有一个Button.ClickListener
似乎是个好主意。 然后,您希望在另一个类中重用此接口,甚至可能在另一个库中重用该接口。 但是,如果不对包含Button
类的库引入(可能不必要的)依赖,则无法执行此操作。 另一方面,如果它是顶级接口,那么您只需将接口提取到另一个库中,例如mylib-core
,将杂乱的按钮单独留在mylib-buttons
。
接口内部的嵌套接口有点不同。 它们可以是同一设计的一部分,旨在一起使用。 @ cricket_007中的一条评论给出了一个很好的例子: Map.Entry
。
- 当外部类通过接口扩展时会发生什么。 它会以任何方式影响嵌套类吗?
这不是很清楚。 如何通过接口扩展类? 不过,无论你在这里指的是什么,如果考虑上述事实,你可以自己回答:嵌套接口只是类命名空间范围的一部分,就是这样。 没有任何其他影响。