Java 接口(interface)与类作为返回类型

标签 java class

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

private class EvenIterator implements DataStructureIterator .

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

  1. public EvenIterator getEvenIterator(){return new EvenIterator();}
  2. public DataStructureIterator getEvenIterator() {return new EvenIterator();}

我发现这两个版本的代码都可以很好地编译,但我就是不知道它们之间有什么区别(如果有的话)以及应该使用哪个版本。

最佳答案

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

另一方面,如果您的方法的约定是您返回一个迭代器,专门提供仅迭代偶数整数的能力,则返回 EvenIterator。这必然意味着您无法替换实现(替换为不迭代偶数整数的实现),并且这样做意味着破坏/更改契约(Contract)。您可以进一步抽象并使 EvenIterator 本身成为一个接口(interface),并为迭代器提供不同的实现(也许一个迭代器迭代内部链表,另一个迭代器迭代内部数组,或者您可能提供迭代器的能力)特定种类的偶数;例如 2 的幂与 4 的幂)。

关于Java 接口(interface)与类作为返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36582015/

相关文章:

Java 登录 ASP.NET Web 窗体的方法

PHP 类名来自变量并带有 "class not found"检查?

Python:如何在创建时向父类注册所有子类

java - 使用 commons-email 配置模拟电子邮件

java - JPA Criteria Builder OneToMany 限制

java - 如果没有要检查的字符,如何设置值

c++ - 类构造函数中的模板和使用(#define)

java - 创建 Java 模型类

python - 从另一个文件 PyQt4 访问操作按钮

java - 匹配键值模式正则表达式