一、Java中的命名规范
好的命名能体现出代码的特征,含义或者是用途,让阅读者可以根据名称的含义快速厘清程序的脉络。不同语言中采用的命名形式大相径庭,Java中常用到的命名形式共有三种,既首字母大写的UpperCamelCase,首字母小写的lowerCamelCase以及全部大写的并用下划线分割单词的UPPER_CAMEL_UNSER_SCORE。通常约定,类一般采用大驼峰命名,方法和局部变量使用小驼峰命名,而大写下划线命名通常是常量和枚举中使用。
类型 | 约束 | 例 |
项目名 | 全部小写,多个单词用中划线分隔‘-’ | spring-cloud |
包名 | 全部小写 | com.alibaba.fastjson |
类名 | 单词首字母大写 | Feature |
变量名 | 首字母小写,多个单词组成时,除首个单词,其他单词首字母都要大写 | userName,password |
常量名 | 全部大写,多个单词,用‘-’分隔 | CACHE_EXPIRED_TIME |
方法名 | 首字母小写,多个单词组成时,除首个单词,其他单词首字母都要大写 | read(),readObj() |
二、包命名
包名统一使用小写,点分隔符之间有且仅有一个自然语义的英文单词或者多个单词自然连接到一块(如 springframework,deepspace不需要使用任何分割)。包名统一使用单数形式,如果类命有复数含义,则可以使用复数形式。
包名的构成可以分为以下几四部分【前缀】 【发起者名】【项目名】【模块名】
三、类命名
类名使用大驼峰命名形式,类命通常时名词或名词短语,接口名除了用名词和名词短语以外,还可以使用形容词或形容词短语,如Cloneable,Callable等,表示实现该接口的类有某种功能或能力。对于测试类则以它要测试的类开头,以Test结尾,如HashMapTest。
对于一些特殊特有名词缩写也可以使用全大写命名,比如XMLHttpRequest,不过笔者认为缩写三个字母以内都大写,超过三个字母则按照要给单词算。这个没有标准如阿里巴巴中fastjson用JSONObject作为类命,而google则使用JsonObjectRequest命名,对于这种特殊的缩写,原则是统一就好。
属性 | 约束 | 例 |
抽象类 | Abstract或者Base开头 | BaseUserService,AbstractTraceInterceptor |
枚举类 | Enum 作为后缀 | GenderEnum |
工具类 | Utils 作为后缀 | StringUtils |
异常类 | Exception 作为后缀 | CustomerException |
接口实现类 | 接口名+Impl | UserServiceImpl |
领域模型相关 | /DO/DTO/VO/DAO | UserDAO,UserDTO |
设计模式相关 | Builder,Factory,Template | ThreadFactory,redisTemplate |
测试类 | Test 作为后缀 | UserServiceTest,表示是测试类 |
MVC分层 | Controller,Service,ServiceImpl,DAO作为后缀 | UserController |
处理特定功能 | Handler,Predicate,Validator | 表示处理器,校验器 |
四、方法
方法命名采用小驼峰的形式,首字小写,往后的每个单词首字母都要大写。 和类名不同的是,方法命名一般为动词或动词短语,与参数或参数名共同组成动宾短语,即动词 + 名词。一个好的函数名一般能通过名字直接获知该函数实现什么样的功能。
4.1 返回真伪值的方法
位置 | 单词 | 意义 | 例 |
前缀 | is | 对象是否符合期待的状态 | isVaild |
前缀 | can | 对象是否能执行所期待的动作 | canRemove |
前缀 | should | 调用方法执行某个命令或方法,好还是不会,应不应该 | shouldMigrate |
前缀 | has | 是否持有所期待的对象 | hasObservers |
前缀 | needs | 调用方,是否需要执行某个方法或者命令 | needsMigrate |
4.2 用来检查的方法
单词 | 意义 | 例 |
ensure | 检查是否为期待的状态,不是则抛出异常或者返回error code | ensureCapactiy |
validate | 检查是否为正确状态 | validateParams |
check | 检查是否为期待状态 | checkInput |
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 |
前缀 or 单独 | schedule | Job和Task放入队列 | scheule,scheuleJob |
前缀 or 单独 | post | 同上 | postJob |
前缀 or 单独 | execute | 执行任务 | execute,executeTask |
前缀 or 单独 | start | 同上 | start,startJob |
前缀 or 单独 | cancel | 停止任务 | cancel,cancelJob |
前缀 or 单独 | stop | 同上 | stop,stopJob |
4.5 回调方法
位置 | 单词 | 意义 | 例 |
前缀 | on | 事件发生时执行 | onCompleted |
前缀 | before | 事件发生之前执行 | beforeUpdate |
前缀 | pre | 同上 | preUpdate |
前缀 | will | 同上 | willUpdate |
前缀 | after | 事件发生之后执行 | afterUpdate |
前缀 | post | 同上 | postUpdate |
前缀 | did | 同上 | didUpdate |
前缀 | should | 确认事件是否可以发送执行 | shouldUpdate |
4.6 操作对象生命周期的方法
单词 | 意义 | 例 |
init | 初始化 | init |
pause | 暂停 | onPause,pause |
stop | 停止 | onStop,stop |
abandon | 销毁,禁止 | abandon |
destroy | 销毁 | destroy |
dispose | 同上 | dispose |
4.7 与集合操作相关的方法
单词 | 意义 | 例 |
contains | 是否持有指定对象 | contains |
add | 添加 | addJob |
append | 追加 | appendJob |
insert | 插入 | insertJob |
put | 添加 | putJob |
remove | 删除 | removeJob |
enqueue | 添加到列队 | enqueueJob |
dequeue | 从队列移除 | dequeueJob |
push | 添加到栈 | pushJob |
pop | 从栈移除 | popJob |
peek | 从栈头取出但不移除 | peekJob |
find | 寻找 | findById |
4.8 与数据相关的方法
单词 | 意义 | 例 |
create | 新创建 | createAccount |
from | 从什么读取 | fromConfig |
to | 转换 | toString |
update | 更新 | updateAccount |
load | 加载 | loadConfig |
fetch | 远程读取 | fetchConfig |
delete | 删除 | deleteAccount |
remove | 删除 | removeAccount |
save | 保存 | saveAccount |
commit | 提交 | commitChange |
clear | 清除 | clearCache |
4.9 成对出现的动词
单词 | 意义 |
get 获取 | set 设置 |
add 增加 | remove 删除 |
create 创建 | destory 移除 |
start 启动 | stop 停止 |
open 打开 | close 关闭 |
read 读取 | write 写入 |
load 载入 | save 保存 |
begin 开始 | end 结束 |
import 导入 | export 导出 |
bind 绑定 | unbind 解绑 |
split 分割 | merge 合并 |
view 查看 | browse 浏览 |
edit 编辑 | modify 修改 |
select 选取 | mark 标记 |
copy 复制 | paste 粘贴 |
undo 撤销 | redo 重做 |
insert 插入 | delete 删除 |
add 加入 | append 添加 |
clear 清除 | |
index 索引 | sort 排序 |
find 查找 | search 搜索 |
increase 增加 | decrease 减少 |
play 播放 | pause 暂停 |
launch 启动 | run 运行 |
compile 编译 | execute 执行 |
debug 调试 | trace 跟踪 |
observe 观察 | listen 监听 |
build 构建 | publish 发布 |
input 输入 | output 输出 |
encode 编码 | decode 解码 |
compress 压缩 | decompress 解压缩 |
pack 打包 | unpack |
parse 解析 | emit 生成 |
connect 连接 | disconnect 断开连接 |
send 发送 | receive 接收 |
downlaod 下载 | upload 上传 |
refresh 刷新 | synchronize 同步 |
update 更新 | revert 复原 |
lock 锁定 | unlock 解锁 |
checkOut 签出 | checkIn 签入 |
submit 提交 | commit 提交 |
push 推 | pull 拉 |
expand 展开 | collapse 折叠 |
begin开始 | end 结束 |
start 开始 | finish 完成 |
enter 进入 | exit 退出 |
abort 放弃 | quit 离开 |
通用命名规则
- 尽量不要使用拼音;杜绝拼音和英文混用。对于一些通用的表示或者难以用英文描述的可以采用拼音,一旦采用拼音就坚决不能和英文混用。
正例: BeiJing, HangZhou
反例: validateCanShu - 命名过程中尽量不要出现特殊的字符,常量除外。
- 尽量不要和jdk或者框架中已存在的类重名,也不能使用java中的关键字命名。
- 妙用介词,如for(可以用同音的4代替), to(可用同音的2代替), from, with,of等。
如类名采用User4RedisDO,方法名getUserInfoFromRedis,convertJson2Map等