假设我们有内部类(我猜其余的代码并不重要, DataStructureIterator
只是 java.util.Iterator<Integer>
扩展的接口(interface)):
private class EvenIterator implements DataStructureIterator
.
现在我们要创建一个返回 EvenIterator 新实例的方法。正如我注意到的,我们可以通过多种方式做到这一点:
-
public EvenIterator getEvenIterator(){return new EvenIterator();}
-
public DataStructureIterator getEvenIterator() {return new EvenIterator();}
我发现这两个版本的代码都可以很好地编译,但我就是不知道它们之间有什么区别(如果有的话)以及应该使用哪个版本。
最佳答案
这要看情况。如果你的方法契约是这样的,你说你正在返回某种迭代器(即,不是特定的实现),那么返回接口(interface)。换句话说,你的契约(Contract)说“除了迭代整数的能力之外,不要假设任何其他行为/功能”。这里的优点是您可以稍后将底层实现替换为其他实现。来电者不会也不应该关心。
另一方面,如果您的方法的约定是您返回一个迭代器,专门提供仅迭代偶数整数的能力,则返回 EvenIterator
。这必然意味着您无法替换实现(替换为不迭代偶数整数的实现),并且这样做意味着破坏/更改契约(Contract)。您可以进一步抽象并使 EvenIterator 本身成为一个接口(interface),并为迭代器提供不同的实现(也许一个迭代器迭代内部链表,另一个迭代器迭代内部数组,或者您可能提供迭代器的能力)特定种类的偶数;例如 2 的幂与 4 的幂)。
关于Java 接口(interface)与类作为返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36582015/