Java接口与类作为返回类型

时间:2016-04-12 19:09:56

标签: java class

假设我们有内部类(其他代码并不重要,我猜,DataStructureIterator只是由java.util.Iterator<Integer>扩展的接口):

private class EvenIterator implements DataStructureIterator

现在我们要创建一个返回EvenIterator新实例的方法。我注意到我们可以通过各种方式做到这一点:

  1. public EvenIterator getEvenIterator(){return new EvenIterator();}
  2. public DataStructureIterator getEvenIterator() {return new EvenIterator();}
  3. 我发现这两个版本的代码编译得很好,但我无法得到它们之间的区别(如果有的话)和应该使用哪个版本。

1 个答案:

答案 0 :(得分:1)

这取决于。如果你的方法契约是这样的,你说你正在返回某种迭代器(即,不是特定的实现),那么返回接口。换句话说,你的合同是说“除了迭代整数的能力之外,不要假设任何其他行为/功能”。这里的优点是,您可以稍后将其他内容替换为底层实现。来电者不会也不应该在乎。

另一方面,如果你的方法的契约是你返回一个迭代器,具体提供了只迭代偶数整数的迭代器,那么返回EvenIterator。这必然意味着你不能交换实现(对于不迭代甚至整数的东西),这样做意味着破坏/改变合同。您可以进一步抽象并使EvenIterator成为一个接口本身并为迭代器提供不同的实现(可能一个迭代内部链表,另一个遍历内部数组,或者您可能提供迭代特定种类的甚至整数;例如,2对权力的权力或4)。