admin管理员组

文章数量:1620369

简洁清爽的代码风格是大多数工程师的追求。在工作中,作者就常常因为起名字而纠结,夸张点可以说是编程 5 分钟,命名 2 小时,所以今天我总结了一份 Java 开发者都需要的一份终极命名规范指南!!

每个公司都有不同的标准,目的是为了保持统一,减少沟通成本,提升团队研发效能。本文结合阿里巴巴开发规范及作者的工作经验,对 Java 领域的相关命名进行整理和总结,供大家参考。希望能为大家在命名时提供一些思路和指导。


文章目录

      • 1、Java 中的命名规范
      • 2、Java 中的包命名
      • 3、Java 中的类命名
      • 4、Java 中的方法命名
        • 4.1、返回真伪值的方法
        • 4.2、用来检查的方法
        • 4.3、按需求才执行的方法
        • 4.4、异步相关方法
        • 4.5、回调方法
        • 4.6、操作对象生命周期的方法
        • 4.7、与集合操作相关的方法
        • 4.8、与数据相关的方法
        • 4.9 成对出现的动词
      • 5、Java 中的变量&常量命名
        • 5.1、变量命名
        • 5.2、常量命名
        • 5.3、通用命名规则
      • 6、Java 中的代码注解
        • 6.1、注解的原则
        • 6.2、注解格式
          • 6.2.1、包注解
          • 6.2.2、类注接
          • 6.2.3、属性注解
          • 6.2.4、方法注释
          • 6.2.5、构造方法注释


1、Java 中的命名规范

良好的命名规范是高质量代码的基石之一。在 Java 中,命名规范不仅帮助保持代码的整洁性和一致性,还能极大地提高代码的可读性和可维护性。遵循这样的规范,可以让其他开发者(包括未来的自己)更容易理解代码的功能和用途,从而更快地进行代码审查和修改。

Java 中常用到的命名形式共有三种,既 ①、首字母大写的 UpperCamelCase, ②、首字母小写的 lowerCamelCase 以及 ③、全部大写的并用下划线分割单词的 UPPERCAMELUNSER_SCORE。

通常约定,类一般采用大驼峰命名,方法和局部变量使用小驼峰命名,而大写下划线命名通常是常量和枚举中使用。

类型(名)约束例子
项目全部小写,多个单词用中划线 “-” 分隔spring-cloud
全部小写com.alibaba.fastjson
单词首字母大写FeatureFieldDeserializer
变量首字母小写的多词组合中,除首词外每词首字母大写userNamepassword
常量全部大写,多个单词用下划线 “_” 分隔CACHE_EXPIRED_TIME
方法同变量read()getById(Long id)

2、Java 中的包命名

在 Java 开发中,包名应全部使用小写字母,并以点 “.” 作为分隔符。包名通常由四部分组成:「前缀」、「发起者名」、「项目名」、「模块名」。

包名遵循单数形式,但如果类的命名有复数含义,则可以使用复数形式。

常见的前缀可以分为以下几种:

前缀含义例子
indi个体项目个人发起,但非独自完成可公开或私有项目,Copyright(版权) 主要属于发起者。indi.发起者名.项目名.模块名.……
onem同 “indi”,标识个体项目个人发起,项目可能涉及多人合作,可公开或私有,Copyright 主要属于发起者。onem.发起者名.项目名.模块名.……
pers个人项目指个人发起,独自完成,可分享的项目,Copyright 主要属于个人pers.个人名.项目名.模块名.……
priv私有项目,指个人发起,独自完成非公开的私人使用的项目,Copyright 属于个人。priv.个人名.项目名.模块名.……
team团队项目,指由团队发起并由该团队开发的项目,Copyright 属于该团队所有team.团队名.项目名.模块名.……
顶级域名公司项目 Copyright 由项目发起的公司所有,如 com(公司名)、org(非盈利组织名)、edu(教育机构)com.公司名.项目名.模块名.……

3、Java 中的类命名

类名使用大驼峰命名形式,类命通常时名词或名词短语,接口名除了用名词和名词短语以外,还可以使用形容词或形容词短语,如 CloneableCallable 等,表示实现该接口的类有某种功能或能力。对于测试类则以它要测试的类开头,以 Test 结尾,如 HashMapTest

对于一些特殊特有名词缩写也可以使用全大写命名,比如 XMLHttpRequest,不过作者认为缩写三个字母以内都大写,超过三个字母则按照要给单词算。不过这个没有明确标准,比如阿里巴巴的 FastJson 就使用 JSONObject 作为类命,而 Google 则使用 JsonObjectRequest 命名,对于这种特殊的缩写,原则是统一就好。

属性(类)约束例子
抽象AbstractBase 开头BaseUserServiceAbstractUserService
枚举Enum 作为后缀ButtonTypeEnum
工具Utils 作为后缀StringUtils
异常Exception 结尾RuntimeException
接口实现接口名 + ImplUserServiceImpl
领域模型相DO、DTO、VO、DAO、Mapper正例:UserDAO 反例:UserDao
设计模式相关BuilderFactory当使用到设计模式时要使用对应的设计模式作为后缀如 ThreadFactory
处理特定功能HandlerPredicateValidator表示处理器,校验器,断言这些类工厂还有配套的方法名如handlepredicatevalidate
测试使用 Test 后缀UserServiceTest 表示用来测试 UserService 类的
MVC分层使用 ControllerServiceServiceImplDAO 后缀UserManageControllerUserServiceUserServiceImpl``UserManageDAO

4、Java 中的方法命名

方法命名采用小驼峰的形式,首字小写,往后的每个单词首字母都要大写。和类名不同的是,方法命名一般为动词或动词短语,与参数或参数名共同组成动宾短语,即「动词 + 名词」。一个好的函数名一般能通过名字直接获知该函数实现什么样的功能。

4.1、返回真伪值的方法
(单词)位置单词意义
前缀is对象是否符合期待的状态isValid
前缀can对象能否执行所期待的动作canRemove
前缀should调用方执行某个命令或方法是好还是不好应不应该,或者说推荐还是不推荐shouldMigrate
前缀has对象是否持有所期待的数据和属性hasObservers
前缀needs调用方是否需要执行某个命令或方法needsMigrate
4.2、用来检查的方法
(单词)位置单词意义
前缀ensure确保对象处于期待的状态,不是则采取措施ensureCapacity
前缀validate验证对象是否符合预期的正确状态,不是则采取措施validateInputs
4.3、按需求才执行的方法
(单词)位置单词意义
后缀IfNeeded需要的时候执行,不需要则什么都不做drawIfNeeded
前缀might可能执行,视情况而定mightCreate
前缀try尝试执行,失败时抛出异常或返回错误代码tryCreate
后缀OrDefault尝试执行,失败时返回默认值getOrDefault
后缀OrElse尝试执行,失败时返回指定的值getOrElse
前缀force强制执行,失败抛出异常或返回错误代码forceCreate, forceStop
4.4、异步相关方法
(单词)位置单词意义
前缀blocking线程阻塞方法blockingGetUser
后缀InBackground执行在后台线程doInBackground
后缀Async异步方法sendAsync
后缀Sync同步方法sendSync
前缀/后缀scheduleJob和Task放入队列schedule, scheduleJob
前缀/后缀post同上postJob
前缀/后缀execute执行异步或同步方法execute, executeTask
前缀/后缀start同上start, startJob
前缀/后缀cancel停止异步方法cancel, cancelJob
前缀/后缀stop同上stop, stopJob
4.5、回调方法
(单词)位置单词意义
前缀on事件发生时执行onCompleted
前缀before事件发生前执行beforeUpdate
前缀pre同上preUpdate
前缀will同上willUpdate
前缀after事件发生后执行afterUpdate
前缀post同上postUpdate
前缀did同上didUpdate
前缀should确认事件是否可以执行shouldUpdate
4.6、操作对象生命周期的方法
(单词)位置单词意义
前缀initialize初始化或延迟初始化使用initialize
前缀pause暂停onPause, pause
前缀stop停止onStop, stop
前缀abandon销毁的替代abandon
前缀destroy同上destroy
前缀dispose同上dispose
4.7、与集合操作相关的方法
(单词)位置单词意义
前缀contains是包含指定对象相同的对象contains
前缀add添加addJob
前缀append添加appendJob
前缀insert插入到下标 ninsertJob
前缀put添加与 key 对应的元素putJob
前缀remove移除元素removeJob
前缀enqueue添加到队列的最末位enqueueJob
前缀dequeue从队列中头部取出并移除dequeueJob
前缀push添加到栈头pushJob
前缀pop从栈头取出并移除popJob
前缀peek从栈头取出但不移除peekJob
前缀find寻找符合条件的某物findById
4.8、与数据相关的方法
(单词)位置单词意义
前缀create新创建createAccount
前缀new新创建newAccount
前缀from从既有的某物新建或是从其他的数据新建fromConfig
前缀to转换toString
前缀update更新既有某物updateAccount
前缀load读取loadAccount
前缀fetch远程读取fetchAccount
前缀delete删除deleteAccount
前缀remove删除removeAccount
前缀save保存saveAccount
前缀store保存storeAccount
前缀commit保存commitChange
前缀apply保存或应用applyChange
前缀clear清除或是恢复到初始状态clearAll
前缀reset清除或是恢复到初始状态resetAll
前缀find查找(单个)findAccountById
前缀query条件查询queryAccountsByStatus
前缀list列表查询listAllAccounts
前缀search搜索searchAccounts
前缀retrieve检索retrieveAccountDetails
前缀get获取(单个)getAccountById
4.9 成对出现的动词
动词意义动词意义
get获取set设置
add增加remove删除
create创建destroy销毁
start启动stop停止
open打开close关闭
read读取write写入
load载入save保存
begin开始end结束
backup备份restore恢复
import导入export导出
split分割merge合并
inject注入extract提取
attach附着detach脱离
bind绑定separate分离
view查看browse浏览
edit编辑modify修改
select选取mark标记
copy复制paste粘贴
undo撤销redo重做
insert插入delete删除
clean清理clear清除
index索引sort排序
find查找search搜索
increase增加decrease减少
play播放pause暂停
launch启动run运行
compile编译execute执行
debug调试trace跟踪
observe观察listen监听
build构建publish发布
input输入output输出
encode编码decode解码
encrypt加密decrypt解密
compress压缩decompress解压缩
pack打包unpack解包
parse解析emit生成
connect连接disconnect断开
send发送receive接收
download下载upload上传
refresh刷新synchronize同步
update更新revert复原
lock锁定unlock解锁
check out签出check in签入
submit提交commit交付
pushpull
expand展开collapse折叠
begin起始end结束
start开始finish完成
enter进入exit退出
abort放弃quit离开
obsolete废弃depreciate废旧
collect收集aggregate聚集

5、Java 中的变量&常量命名

5.1、变量命名

变量是指在程序运行中可以改变其值的量,包括成员变量和局部变量。变量名由多单词组成时,第一个单词的首字母小写,其后单词的首字母大写,俗称骆驼式命名法(也称驼峰命名法),如 computedValuesindex、变量命名时,尽量简短且能清楚的表达变量的作用,命名体现具体的业务含义即可。

变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。变量名应简短且富于描述。变量名的选用应该易于记忆,即,能够指出其用途。尽量避免单个字符的变量名,除非是一次性的临时变量。POJO 中的布尔变量,都不要加 is(数据库中的布尔字段全都要加 is_ 前缀)。

5.2、常量命名

常量命名 CONSTANT_CASE,一般采用全部大写(作为方法参数时除外),单词间用下划线分割。那么什么是常量呢?

常量是在作用域内保持不变的值,一般使用 final 进行修饰。一般分为三种,全局常量(public static final 修饰),类内常量(private static final 修饰)以及局部常量(方法内,或者参数中的常量),局部常量比较特殊,通常采用小驼峰命名即可。

例子:

/**
 * 一个demo
 *
 * @author lizhengi
 * @date 2024-06-04 00:20
 **/

public class HelloWorld {

    //局部常量(正例)
    public  static  final long  USER_MESSAGE_CACHE_EXPIRE_TIME  =  3600;
    //局部常量(反例,命名不清晰)
    public static final long  MESSAGE_CACHE_TIME = 3600;
    // 全局常量
    private  static final String ERROR_MESSAGE  = "error message";
    //成员变量
    private int currentUserId;
    
    /**
     * 控制台打印 {@code message} 信息
     *
     * @param message 消息体,局部常量
     */
    public void  sayHello ( final String  message ) {
        System.out.println("Hello world!");
    }
}

在命名常量时,清晰的命名比简洁更重要,尤其是这些常量在代码中扮演重要的配置或参数角色。清晰的命名有助于理解常量的具体用途,减少错误,并使得代码的维护和阅读更为直观。

以"用户消息缓存过期时间"为例,这是一个涉及时间参数的常量,可能在多个地方使用。以下是两种可能的命名方式,:

  1. USER_MSG_CACHE_EXPIRY_TIME
  2. UMCT_EXPIRATION

我们可以评估哪种更为清晰,一目了然

5.3、通用命名规则
  1. 尽量不要使用拼音;杜绝拼音和英文混用。对于一些通用的表示或者难以用英文描述的可以采用拼音,一旦采用拼音就坚决不能和英文混用。正例:BeiJingHangZhou 反例:validateCanShu

  2. 命名过程中尽量不要出现特殊的字符,常量除外;

  3. 尽量不要和 JDK 或者框架中已存在的类重名,也不能使用 Java 中的关键字命名。

  4. 妙用介词,如 for(可以用同音的 4 代替), to(可用同音的 2 代替),from, withof 等。如类名采用 User4RedisDO,方法名 getUserInfoFromRedisconvertJson2Map 等。


6、Java 中的代码注解

6.1、注解的原则

好的命名增加代码阅读性,代码的命名往往有严格的限制。而注解不同,程序员往往可以自由发挥,单并不意味着可以为所欲为之胡作非为。优雅的注解通常要满足三要素。

  1. “Nothing is strange”:没有注解的代码对于阅读者非常不友好,哪怕代码写的在清除,阅读者至少从心理上会有抵触,更何况代码中往往有许多复杂的逻辑,所以一定要写注解,不仅要记录代码的逻辑,还有说清楚修改的逻辑;

  2. “Less is more”:从代码维护角度来讲,代码中的注解一定是精华中的精华。合理清晰的命名能让代码易于理解,对于逻辑简单且命名规范,能够清楚表达代码功能的代码不需要注解。滥用注解会增加额外的负担,更何况大部分都是废话(// 根据id获取信息【废话注解】);

  3. “Advance with the time”:注解应该随着代码的变动而改变,注解表达的信息要与代码中完全一致。通常情况下修改代码后一定要修改注解。

6.2、注解格式

注解大体上可以分为两种,一种是 JavaDoc 注解,另一种是简单注解。JavaDoc 注解可以生成 JavaAP I为外部用户提供有效的支持 JavaDoc 注解通常在使用 IDEA,或者 Eclipse 等开发工具时都可以自动生成,也支持自定义的注解模板,仅需要对对应的字段进行解释。参与同一项目开发的同学,尽量设置成相同的注解模板。

6.2.1、包注解

包注解在工作中往往比较特殊,通过包注解可以快速知悉当前包下代码是用来实现哪些功能,强烈建议工作中加上,尤其是对于一些比较复杂的包,包注解一般在包的根目录下,名称统一为 package-info.java

/**
 * 落地也质量检测
 * 1. 用来解决什么问题
 * 对广告主投放的广告落地页进行性能检测,模拟不同的系统,如Android,IOS等; 模拟不同的网络:2G,3G,4G,wifi等
 * 2. 如何实现
 * 基于chrome浏览器,用chromedriver驱动浏览器,设置对应的网络,OS参数,获取到浏览器返回结果。
 * 注意:网络环境配置信息{@link cn.mycookies.landingpagecheck.meta.NetWorkSpeedEnum}目前使用是常规速度,可以根据实际情况进行调整
 * @author lizhengi
 * @time 2024-06-04 00:20
 */

package cn.maruifu.landingpagecheck;
6.2.2、类注接

JavaDoc 注解中,每个类都必须有注解。

/**
 * Copyright (C), 2019-2020, XiaoMage  balabala...
 * 类的介绍:这是一个用来做什么事情的类,有哪些功能,用到的技术.....
 * @author   类创建者姓名 保持对齐
 * @date     创建日期 保持对齐
 * @version  版本号 保持对齐
 */
6.2.3、属性注解

在每个属性前面必须加上属性注释,通常有一下两种形式,至于怎么选择,你高兴就好,不过一个项目中要保持统一。

/** 提示信息 */
private String userName;
/**
 * 密码
 */
private String password;
6.2.4、方法注释

在每个方法前面必须加上方法注释,对于方法中的每个参数,以及返回值都要有说明。

/**
  * 方法的详细说明,能干嘛,怎么实现的,注意事项...
  * @param xxx 参数1的使用说明, 能否为 null
  * @return 返回结果的说明, 不同情况下会返回怎样的结果
  * @throws 异常类型   注明从此类方法中抛出异常的说明
  */
6.2.5、构造方法注释

在每个构造方法前面必须加上注释,注释模板如下:

/**
  * 构造方法的详细说明
  * @param xxx 参数1的使用说明, 能否为 null
  * @throws 异常类型 注明从此类方法中抛出异常的说明
  */

而简单注解往往是需要工程师字节定义,在使用注解时应该注意一下几点:

  1. 枚举类的各个属性值都要使用注解,枚举可以理解为是常量,通常不会发生改变,通常会被在多个地方引用,对枚举的修改和添加属性通常会带来很大的影响。
  2. 保持排版整洁,不要使用行尾注释;双斜杠和星号之后要用 1 个空格分隔。

例子:

int id  = 1 ; // 反例:不要使用行尾注释
//反例:换行符与注释之间没有缩进

int  age  = 18 ;

// 正例:姓名
String name ;

/**
 * 1. 多行注释
 *
 * 2. 对于不同的逻辑说明,可以用空行分隔
 */

本文标签: 开发者小时指南Java