我有一个接口,它只有一个实现。以下对表示一个简单的 java 对象。我想删除该接口并直接使用一个对象。但我想了解何时需要它以及为什么以这种方式设计它。这样做绝对不是为了减轻单元测试的覆盖率。那么,为什么我的项目中只有一个实现的接口呢?谢谢。
5 回答
当您可能扩展/更改项目时,界面很有用。例如,如果您通过将数据存储在文本文件中来启动项目,然后决定从数据库更改为这样做。如果这两个都是同一个接口的实现,那么将第一个换成第二个是非常简单的。只是在使用它的类中交换具体实现的一个例子。例如,简单地改变
IStorage storage = new FileStorage();
至
IStorage storage = new DBStorage();
虽然为单个实现提供一个接口似乎毫无意义,但它可以为您节省以后的大量重构工作。
如果您为实现定义接口并在程序中使用该接口,您始终可以自由地编写新实现并用旧实现替换它,而无需更改使用它的类的代码。
最好的做法是使用接口而不是实现,这样更改需求的危害较小。
这取决于。但这不是一个坏主意。
在 C 和许多版本的 Pascal 中,将接口与实现分开是常见的做法。当模块依赖的实现发生变化时,它可以帮助编译器避免不必要的重新编译模块。
在 Java 中,编译器通常不是问题。Java 提供了公共、受保护、私有和包私有(隐式)访问类,它们限制了其他类在多大程度上可以依赖于特定类的细节。Javadoc 提供(默认情况下)省略不需要和不需要的细节的文档。我们还有被广泛推广的 YAGNI 原则:如果“你不需要它”,就不要设计它。
然而,在 Java 中使用显式接口而不是直接使用实现提供了一个额外的机会,可以非常清楚地了解特定类的用户应该依赖什么结构和行为。实现多个接口的能力意味着特定类的用户甚至可以指定对实现的一个或多个特定方面的依赖,例如它的可序列化性质。
如果您正在为您的代码进行单元测试(我希望您这样做),那么您很有可能需要通过一些存根实现来模拟您的类的使用。所以你至少需要接口来进行单元测试。
PS 我知道,像 Mockito 这样的现代模拟框架可以基于类进行模拟,所以从技术上讲,你可以在没有接口的情况下实现这一点。但是(对我来说)感觉就像 hack,因为这正是应该使用界面的地方。