将您的Interface 命名为它是什么。 Truck。不是ITruck,因为它不是ITruck,而是Truck。
Java 中的Interface 是Type。然后你有DumpTruck、TransferTruck、WreckerTruck、CementTruck等implements Truck。
当您使用Interface 代替子类时,您只需将其转换为Truck。如List<Truck>。将I 放在前面只是Hungarian style 符号tautology,它只会为您的代码添加更多内容。
所有现代 Java IDE 的标记接口和实现以及没有这个愚蠢的符号。不要称它为TruckClass,那是tautology,就像IInterface 重言式一样糟糕。
如果它是一个实现,它就是一个类。这条规则唯一真正的例外,而且总是有例外,可能是AbstractTruck。由于只有子类会看到这一点,并且您永远不应该转换为 Abstract 类,它确实添加了一些关于该类是抽象的信息以及应该如何使用它。您仍然可以想出一个比AbstractTruck 更好的名称并使用BaseTruck 或DefaultTruck,因为abstract 在定义中。但是由于Abstract 类永远不应该是任何面向公众的接口的一部分,我相信这是一个可以接受的规则例外。让构造函数protected 可以跨越这个鸿沟。
Impl 后缀也只是更多的噪音。更多的重言式。任何不是接口的东西都是实现,即使是部分实现的抽象类。你要在每个Class 的每个名字上加上那个愚蠢的Impl 后缀吗?
Interface 是关于公共方法和属性必须支持的合同,它也是Type 信息。实现Truck 的所有内容都是Type 的Truck。
查看 Java 标准库本身。你看到IList、ArrayListImpl、LinkedListImpl了吗?不,您会看到 List 和 ArrayList 和 LinkedList。这是一个很好的article 关于这个确切的问题。任何这些愚蠢的前缀/后缀命名约定都违反了DRY 原则。
另外,如果您发现自己在对象中添加了DTO、JDO、BEAN 或其他愚蠢的重复后缀,那么它们可能属于package,而不是所有这些后缀。正确打包的命名空间是自我记录的,并减少了这些构思拙劣的专有命名方案中的所有无用冗余信息,大多数地方甚至内部都没有以一致的方式遵守。
如果您想使您的 Class 名称独一无二的方法就是在其后缀上加上 Impl,那么您需要重新考虑使用 Interface。因此,当您遇到Interface 和单个Implementation 不是从Interface 唯一专门化的情况时,在大多数情况下您可能不需要Interface。
但是,一般来说,为了可维护性、可测试性、模拟,最好的做法是提供接口。见this answer for more details。
另请参阅 Martin Fowler 关于 InterfaceImplementationPair 的这篇有趣文章