命名规范
本文介绍Java基本规范中的命名规范,命名规范包括包的命名规范、类的命名规范、变量的命名规范和方法的命名规范4种。另外会扩展介绍各类方法的具体命名规范(此部分为实践部分)。
包体的命名规范
在Java中包的命名规则一般跟公司的域名有很的的关系。如公司的域名为 depsea.org
那么包的前缀一般将命名为 org.depsea
。说到这里就需要说一下目前常见的包的名称结构。
一般包的名称结构由三部分组成:公司域名(反序)+项目名 + 模块。如 Apache Flink中包的命名前两部分为 org.apache.flink
其中 API模块的包的命名为:org.apache.flink.api
Streaming模块的包的命名为:org.apache.flink.steaming
。其中模块下又有具体功能,具体功能应再细分包体。
包的命名一般遵循以下规则:
- 包名全部小写
- 包名应尽量使用一个单词
- 如需使用多个单词,咋单词之间不用遵循驼峰命名或Snake命名,即两个单词全小写,中间不加任何连接字符。如
inboundorder
但是一般我们应选择两个单词中最核心的词作为包的名称,如上例中的inbound
。 - 一般不在包名中使用下划线
这里也顺便说下Maven中的 GAV
,
groupId
一般定义为:公司域名(反序)+项目名;artifactId
一般为模块名称,模块名称一般全小写,单词之间-
分割。
如下:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java</artifactId>
<version>${flink.version}</version>
</dependency>
这里说的项目的概念是一个大的工程,比如Flink是一个项目,OA管理系统是一个项目,通常情况下一个jar包并不是一个项目,只能算是项目的组成部分。
类的命名规范
Java 类名的命名规范通常遵循以下几个约定:
- 类名应该以大写字母开头,采用大驼峰命名法(PascalCase),例如:MyClassName。
- 类名应该具有描述性,清晰地表达该类的用途或功能。
- 避免使用缩略词,除非是广为认可的缩略词。
- 类名应该是名词或名词短语,而不是动词。
- 抽象类一般使用
Abstract
开头。如AbstractUserService
。
有些公司会要求接口前要加 I
表示这个类是一个接口。在本文中并不建议这样做,反观现在优秀的开源项目的源码中,没有一个项目是按照这样的规范做的。我们现在可以轻松的从 IDE 的图标上看出类、接口、抽象类、异常等类型;而且现在几乎没有人会再使用记事本这样的纯文本工具来编写代码,因此这样做是没有必要的。
还有一些 MVC 架构的项目或 DDD 项目开发中的具体规范
- 业务接口一般使用
Service
结尾,其实现类使用ServiceImpl
结尾。在很多开源项目中也有使用Impl
作为接口实现类后缀的习惯。 - MyBatis中的 Mapper 一般以
Mapper
结尾。 - 控制层一般以
Controller
结尾。 - 事件一般以
Event
结尾。 - 监听一般以
Listener
结尾。 - 在 SpringBoot 项目中,配置类一般以
Configuration
结尾,而配置信息一般以Properties
结尾,如org.springframework.boot.autoconfigure.jdbc.DataSourceProperties
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
- DTO 一般使用
Dto
结尾 - VO 一般使用
Vo
结尾
变量的命名规范
在Java中,变量名的命名规范通常遵循以下几点:
- 变量应已小写字母开头,采用小驼峰命名法(CamelCase),如
pageInfo
。 - 变量名最好使用有意义的单词或简短短语,以提高代码的可读性。应当避免使用
abc
,a1
这样无意义的变量名。 - 避免使用单个字符的变量名,除非是在循环中使用。如循环中的
i,j,k
。 - 对于常量,通常使用全大写字母,并用下划线分隔单词,例如:
MAX_VALUE
。
像 i,j,k
这些变量常用在循环中,请不要用这些变量来代表其他意思,这样容易引起误解。一般在Java中会有一些常用的缩写,具体如下:
ins
: 一般用于InputStream
os
或out
: 一般用于OutputStream
num
: 通常用户表示一个数量的变量len
: 通常用于表示长度的变量idx
: 通常用于表示索引的变量,有时也用i
在 Lambda 表 达式中常常用单个字符的变量名,但是要根据实际情况,以代码的可读性为重。如果单个字符的变量名并不影响代码的可读性,通常是可以使用的。常见的有 o
和 e
,o
有 Object 的意思,而 e
有 Element(元素)的意思。
Stream.of("one", "two", "three", "four")
.filter(e -> e.length() > 3)
.peek(e -> System.out.println("Filtered value: " + e))
.map(String::toUpperCase)
.peek(e -> System.out.println("Mapped value: " + e))
.collect(Collectors.toList());
方法的命名规范
在Java中,方法名的命名规范通常遵循以下几点:
- 方法名应该以小写字母开头,并使用驼峰命名法(CamelCase)命名,即第一个单词的首字母小写,后续单词的首字母大写,不包含下划线或空格。
- 方法名应该能够清晰地表达方法的功能或目的,避免使用含糊不清或过于简单的名称。
- 方法名应该是动词或动词短语,以便于理解方法的行为。例如,
calculateTotal
、getUserInfo
。 - 避免使用缩写或简写的方法名,除非是广泛认可的缩写。
- 对于 Boolean 类型的方法,通常以
is
、has
、can
等开头,以明确表示返回值为布尔类型。例如,isOpen
、hasPermission
。 - 避免使用 Java 关键字作为方法名,以免造成混淆。
一些业务类中方法命名的注意事项。
方法命名应尽量简洁,如在一个用户服务类 (UserService
) 中,获取用户信息的方法可以直接命名为 get
,而没有必要命名为 getUser
,删除的方 法可以直接命名为 delete
或 deleteById
。因为按照职责划分,这个业务类处理的就是和用户相关的业务,所有方法都应该与用户有关,因此应当在方法命名上省略 User
。