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