Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java接口/实现命名约定_Java_Naming Conventions - Fatal编程技术网

Java接口/实现命名约定

Java接口/实现命名约定,java,naming-conventions,Java,Naming Conventions,如何命名您创建的不同类/接口? 有时我没有实现信息添加到实现名称中,比如接口FileHandler和类SqlFileHandler 发生这种情况时,我通常以“普通”名称命名接口,如Truck,并命名实际的类TruckClass 在这方面,如何命名接口和类?标准的C#约定在Java中也很有效,它是在所有接口前面加上一个I——因此文件处理程序接口将是IFileHandler,而卡车接口将是ITruck。它是一致的,并且很容易区分接口和类 有些人不喜欢这样,它更像是一种.NET约定而不是Java,但您

如何命名您创建的不同类/接口? 有时我没有实现信息添加到实现名称中,比如接口
FileHandler
和类
SqlFileHandler

发生这种情况时,我通常以“普通”名称命名接口,如
Truck
,并命名实际的类
TruckClass


在这方面,如何命名接口和类?

标准的C#约定在Java中也很有效,它是在所有接口前面加上一个
I
——因此文件处理程序接口将是
IFileHandler
,而卡车接口将是
ITruck
。它是一致的,并且很容易区分接口和类

有些人不喜欢这样,它更像是一种.NET约定而不是Java,但您可以使用大写字母I前缀命名接口,例如:

IProductRepository - interface
ProductRepository, SqlProductRepository, etc. - implementations
反对这种命名约定的人可能会争辩说,您不应该关心代码中的接口还是对象,但我发现它更容易快速阅读和理解


我不会用“class”后缀来命名实现类。这可能会导致混淆,因为您实际上可以在代码中使用“类”(即类型)对象,但在您的情况下,您不是在使用类对象,而是在使用普通的旧对象。

命名您的
接口<代码>卡车
。不是
ITruck
,因为它不是
ITruck
它是
卡车

Java中的
接口是一个。然后有
自卸车
转运车
破坏者卡车
水泥卡车
,等等
机具卡车

当您使用
接口
代替子类时,只需将其强制转换为
卡车
。如
列表中所示
。将
I
放在前面只是一种符号,它只会在代码中添加更多的内容

所有现代JavaIDE都会标记接口和实现,而且没有这种愚蠢的标记法也不行。不要称它为
TruckClass
,它和
i界面一样糟糕

如果它是一个实现,那么它就是一个类。这条规则唯一真正的例外,也总是有例外,可能是类似于
AbstractTruck
的东西。因为只有子类才会看到这一点,而且您永远不应该将其转换为
抽象类
类,因此它确实添加了一些信息,说明该类是抽象类以及应该如何使用它。您仍然可以想出一个比
AbstractTruck
更好的名称,并使用
BaseTruck
DefaultTruck
,因为
abstract
在定义中。但是由于抽象类永远不应该是任何面向公众的接口的一部分,我相信这是一个可以接受的例外。让构造函数
受到保护
对于跨越这一鸿沟有很大的帮助

Impl
后缀也只是更多的噪音。更多的同义反复。任何不是接口的东西都是实现,即使是部分实现的抽象类。你打算在每个人的名字上都加上那愚蠢的
Impl
后缀吗

接口
是一个关于公共方法和属性必须支持什么的契约,也是一个信息。实现
卡车
的一切都是
卡车
的一部分

看看Java标准库本身。您是否看到
IList
ArrayListPL
LinkedListImpl
?不,您可以看到
列表
数组列表
,以及
链接列表
。对于这个问题,这里有一个很好的解释。任何这些愚蠢的前缀/后缀命名约定都违反了这一原则

此外,如果您发现自己向对象添加了
DTO
JDO
BEAN
或其他愚蠢的重复后缀,那么它们可能属于a,而不是所有这些后缀。正确打包的名称空间是自文档化的,并减少了这些构思非常糟糕的专有命名方案中所有无用的冗余信息,而这些方案在大多数地方甚至内部都没有以一致的方式遵循


如果你能想出的使你的
名称唯一的办法就是在它后面加上
Impl
,那么你需要重新考虑是否有一个
接口
。因此,如果您有一个
接口
和一个
实现
,而该实现不是从
接口
专门化的,那么在大多数情况下,您可能不需要
接口

然而,一般来说,对于可维护性、可测试性和模拟,提供接口是最佳实践。看


另请参考Martin Fowler关于卡车类主题的这篇有趣文章,听起来它是一类卡车,我认为建议的解决方案是添加
Impl
后缀。在我看来,最好的解决方案是在实现名称中包含一些信息,即特定实现中发生的情况(就像我们使用
List
接口和实现:
ArrayList
LinkedList
),但有时您只有一个实现,并且由于远程使用(例如)而必须有接口,那么(如开头所述)
Impl
就是解决方案

接口的名称应描述接口所代表的抽象概念。任何实现类都应该具有某种特定的特性,这些特性可以用来给它一个更具体的名称

如果只有一个实现类,而您想不出任何具体的实现类(这意味着要将其命名为
-Impl
),那么看起来没有理由使用接口