为什么要为每个类创建接口而不是它们的实现

Ske*_*ith 0 java interface

它似乎是标准所以我到目前为止一直在使用它,但现在我正在从头开始构建一个新类而不是修改旧类,并且我觉得我应该理解为什么我应该遵循项目约定.

几乎每个类都有一个调用它的接口classnameable.在代码中database.class永远不会出现一次,但在我希望使用我看到的那个类的地方databaseable.class.

根据我的理解,接口是一个从未实现过的类,但是为了保持标准而固有.那么为什么接口被用作真正的类呢?

Mic*_*rdt 9

根据我的理解,接口是一个从未实现过的类,但是为了保持标准而固有.那么为什么接口被用作真正的类.

这有点困惑.接口定义API,以便来自不同作者,模块或项目的代码片段可以进行交互.例如,java.util.Collections.sort()可以对实现List接口的任何内容进行排序,并包含实现接口的对象Comparable- 即使在编写排序代码时可能还没有实现类!

现在,在你的项目的情况似乎反映了一个不幸的是相当常见的反模式:一种针对接口的一切,大多是单一的实现类,甚至是内部类.

过去,测试驱动开发(TDD)的支持者强烈推动这一点,他们认为能够独立测试每个类,并将所有依赖项替换为模拟对象是至关重要的.较旧的模拟框架只能模拟接口,因此为了能够隔离地测试每个类,所有类间依赖关系都必须通过接口.

幸运的是,较新的模拟框架可以模拟具体的类,并且不要求您使用不必要的接口污染您的项目.有些人可能仍会争辩说无论如何都应该"减少耦合",但是IMO他们只是在合理化他们不改变他们的做法的愿望.

当然,如果你不做原教旨主义的TDD,那么就没有充分的理由为所有东西建立一个接口 - 但是有很好的理由为某些东西设置接口.