跳到主要内容

命名规范

本文介绍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>
xml
备注

这里说的项目的概念是一个大的工程,比如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
  • 变量名最好使用有意义的单词或简短短语,以提高代码的可读性。应当避免使用 abca1 这样无意义的变量名。
  • 避免使用单个字符的变量名,除非是在循环中使用。如循环中的 i,j,k
  • 对于常量,通常使用全大写字母,并用下划线分隔单词,例如:MAX_VALUE

i,j,k 这些变量常用在循环中,请不要用这些变量来代表其他意思,这样容易引起误解。一般在Java中会有一些常用的缩写,具体如下:

  • ins: 一般用于InputStream
  • osout: 一般用于 OutputStream
  • num: 通常用户表示一个数量的变量
  • len: 通常用于表示长度的变量
  • idx: 通常用于表示索引的变量,有时也用 i

在 Lambda 表达式中常常用单个字符的变量名,但是要根据实际情况,以代码的可读性为重。如果单个字符的变量名并不影响代码的可读性,通常是可以使用的。常见的有 oeo 有 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

方法的命名规范

在Java中,方法名的命名规范通常遵循以下几点:

  • 方法名应该以小写字母开头,并使用驼峰命名法(CamelCase)命名,即第一个单词的首字母小写,后续单词的首字母大写,不包含下划线或空格。
  • 方法名应该能够清晰地表达方法的功能或目的,避免使用含糊不清或过于简单的名称。
  • 方法名应该是动词或动词短语,以便于理解方法的行为。例如,calculateTotalgetUserInfo
  • 避免使用缩写或简写的方法名,除非是广泛认可的缩写。
  • 对于 Boolean 类型的方法,通常以 ishascan 等开头,以明确表示返回值为布尔类型。例如,isOpenhasPermission
  • 避免使用 Java 关键字作为方法名,以免造成混淆。

一些业务类中方法命名的注意事项。

方法命名应尽量简洁,如在一个用户服务类 (UserService) 中,获取用户信息的方法可以直接命名为 get,而没有必要命名为 getUser,删除的方法可以直接命名为 deletedeleteById。因为按照职责划分,这个业务类处理的就是和用户相关的业务,所有方法都应该与用户有关,因此应当在方法命名上省略 User