我一直在用Java编写大学的几门课程,我有以下问题:
从方法论上接受每个类应该实现一个接口吗?不这样做被认为是不好的做法吗?你能描述一下使用接口不是一个好主意的情况吗?
编辑:就个人而言,我喜欢将Interfaces作为一种方法和习惯使用的概念,即使它并不明显有益.Eclipse自动创建了一个包含所有方法的类文件,因此它不会浪费任何时间.
如果您不打算使用它,则无需创建界面.
通常,在以下情况下需要接口:
您的程序将为您的组件提供多种实现.例如,作为代码一部分的默认实现,以及在JUnit测试中使用的模拟实现.有些工具可以自动创建模拟实现,例如EasyMock.
您希望对此类使用依赖注入,使用Spring或JBoss Micro-Container等框架.在这种情况下,最好使用接口从一个类和其他类指定依赖项.
遵循YAGNI原则,如果您真的需要,类应该实现接口.否则你从中获得了什么?
编辑:接口提供了一种抽象.如果要在不同的实现(实现相同接口的许多类)之间进行交换,它们特别有用.如果它只是一个类,那么就没有收获.
每个类都实现了一个接口(即契约),因为它提供了非私有API.是否应该选择将接口单独表示为Java接口取决于实现是否是"变化的概念".
如果您完全确定只有一个合理的实现,那么就不需要接口.否则,接口将允许您在不更改客户端代码的情况下更改实现.
有些人会喊"YAGNI",假设您可以在以后发现新要求时完全控制更改代码.其他人会害怕他们需要改变不可更改的 - 一个已发布的API.
如果你没有实现一个接口(并使用某种工厂来创建对象),那么某些类型的更改将迫使你打破开闭原则.在某些情况下,这是商业上可接受的,而在其他情况下则不是.
你能描述一下使用接口不是一个好主意的情况吗?
在某些语言(例如C++,C#,但不是Java)中,如果您的类不包含虚拟方法,则可以获得性能优势.
在小程序或没有发布API的应用程序中,您可能会看到维护单独接口的成本很低.
如果由于分离接口和实现而导致复杂性显着增加,那么您可能不会将接口用作合同.接口降低了复杂性.从消费者的角度来看,组件成为履行合同条款的商品,而不是具有本身具有复杂实施细节的实体.
不,每个类都没有必要实现一个接口.仅在使代码更清晰且更易于编写时才使用接口.
如果您的程序目前不需要为给定的类提供多于1个实现,那么您不需要接口.例如,在我写的一个简单的国际象棋程序中,我只需要一种类型的Board对象.棋盘是棋盘棋盘.制作一个Board接口并实现它只需要更多的代码来编写和维护.
如果你最终需要它,那么切换到界面是如此容易.