Java编码规约
编码规约
命名风格
- 代码中命名不能以_或$开始或者结束
- 命名用英文
- 类名使用UpperCamelCase风格,DO/DTO/VO/PO/UID等除外
- 方法名/参数名/成员变量/局部变量使用lowerCamelCase风格
- 常量命名全大写,单词间下划线隔开
- 抽象类:AbstractXxx或BaseXxx
- 异常类:XxxException
- 测试类:XxxTest
- 数组命名:数据类型[] 数组名称;
- POJO类中布尔类型变量不加is前缀
- 包名统一使用小写;统一使用单数形式(类名有复数含义,类名可以用复数)
- 杜绝不规范缩写
- 命名使用完整单词组合表达意思
常量定义
- 不允许未经预先定义的常量直接出现在代码中
- 长整型复制时,数值后面使用大写L
代码格式
- 大括号的用法:
大括号内容为空:直接写成{},中间无需换行空格
大括号内容不为空: {
},写成这种形式,左括号钱空格
- 小括号:小括号和字符之间不能有空格
- if/for/while/switch/do等保留字与括号之间都必须加空格
- 任何二目、三目运算符的左右两边都需要加一个空格
- 采用4个空格缩进,禁止使用Tab字符
- 多个参数逗号后边必须加空格
OOP规约
- 访问静态变量或方法,直接通过类名访问
- 覆写方法必须加@Override注解
- 相同参数类型和业务含义才能使用Java的可变参数,尽量不用
- 不用过时的类或方法
- 使用常量或者确定有值的对象调用equals(),避免抛空指针异常
- 整形包装类对象之间值的比价全部用equals()方法比较
- 定义数据类对象DO类时,属性类型与数据库字段类型匹配
- 禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象
- 定义DO/DTO/VO等POJO类时,不要设定任何属性默认值
- 初始化逻辑用init()方法,不要放在构造方法中,构造方法禁止添加任何业务逻辑
- POJO类中,禁止同时存在对应属性xxx的isXxx()和getXxx()方法
- 集合初始化时,最好指定集合初始值大小
控制语句
- 在一个switch块内,每个case要么通过continue/break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;在一个switch块内,都必须包含一个default
- 在if/else/for/while/do语句中必须使用大括号
其他规约
- 在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
- velocity调用POJO类的属性时,直接使用属性名取值即可,模板引擎会自动按规范调用POJO的getXxx(),如果是boolean基本数据类型变量(boolean命名不需要加is前缀),会自动调用isXxx()方法。
- Math.random() 这个方法返回是double类型,取值的范围0≤x<1(能够取到零值,注意除零异常),如果想获取整数类型的随机数,直接使用Random对象的nextInt或者nextLong方法。
- 获取当前毫秒数:System.currentTimeMillis()
- 日期格式化时,传入pattern中表示年份统一使用小写的y。 月份是大写的M;表示分钟则是小写的m;24小时制的是大写的H; 12小时制的则是小写的h; SSS是毫秒
数据库建表规约
- 表名字段名必须用小写字母或数字,禁止数字开头,禁止两个下划线中只出现数字
- 表名不用复数
- 主键索引:pk_字段名;唯一索引:uk_字段名;普通索引:idx_字段名;
- 小数类型:decimal
- varchar长度不超过5000,存储长度>5000,则独立一张表,定义字段类型为text,用主键对应
- 表必备三个字段:id:bigint unsigned, make_time:datetime ;modify_time:datetime
索引规约
- 业务上具有唯一特性的字段必须建成唯一索引
- 超过三个表禁止join
- 需要join的字段,数据类型必须一致
- 多表关联查询,保证被关联的字段需要有索引
- varchar字段建立索引必须指定索引长度
- 页面搜索严禁左模糊或者全模糊
SQL语句
- 不要使用count(列名)或count(常量)来替代count(*)
- count(distinct col) 计算该列除NULL之外的不重复行数
- 用sum()时需注意NPE问题
NPE问题:NullPointerException,空指针异常
- 写分页查询逻辑时,若count为0应直接返回
- 不得使用外键与级联,一切外键概念必须在应用层解决
- 禁止使用存储过程
- 数据订正(特别是删除、修改记录操作)时,要先select,避免出现误删除
- in操作能避免则避免
- 禁止任何图省事而编写的长的执行效率缓慢的SQL
- MySQL的where条件应该按照数据特性依次排序,编写where条件应从左到右的顺序依次排列
ORM映射
- 表查询中,需要哪些字段必须明确写明,不用*
- POJO类布尔属性不能加is,数据库字段必须加is_,要求在resultMap中进行字段和属性间的映射
- 对于MyBatis的sql.xml配置参数使用:#{},#param# 不要使用${}
- 对于Spring Data JPA的Repository配置参数使用::param,$1 不要使用直接拼接SQL的方式
防止SQL注入的两种方式:
MyBatis的sql.xml配置参数使用:#{},#param# 不要使用${}
Spring Data JPA的Repository配置参数使用::param,$1 不要使用直接拼接SQL的方式
异常处理
- RuntimeException不应该通过catch方式来处理
- 异常不要用来做流程控制,条件控制
- catch时分清楚稳定代码和非稳定代码
- 捕获异常处理异常或者抛给调用者
- 事务代码中try块catch异常后,若需要回滚事务,手动回滚事务
- finally开必须对资源对象和流对象进行关闭,有异常也要做try-catch
- 不要再finally块中使用return
- 捕获异常和抛异常必须完全匹配或者捕获异常时抛异常的父类
- 在调用RPC、二方包、或动态生成类的相关方法时,捕捉异常必须使用Throwable类来进行拦截
- 方法的返回值可以为null,不强制返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回null值。
- 在实际开发中catch块中的异常输出必须使用log日志的ERROR级别进行输出
- 防止NPE,是程序员的基本修养
日志规约
- 应用中应该以来使用日志框架SLF4J中的API
- 所有文件至少保存15天;网络日志保存不少于6个月
- 扩展日志命名方式:appName_logType_logName.log
- logType:日志类型
- logName:日志描述
- 日志输出时候,字符串变量之间的拼接使用占位符的方式
- 对于trace/debug/info级别的日志输出,必须进行日志级别的开关判断
注释规约
- 类、类属性、类方法的注释必须使用Javadoc规范,使用/**内容*/格式
- 所有的抽象方法(包括接口中的方法)必须要用Javadoc注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。
- 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释,注意与代码对齐
- 所有的枚举类型字段必须要有注释,说明每个数据项的用途
- 专有名词与关键字保持英文原文,注释说清楚最重要
- 谨慎注释掉代码,注释代码的情况加入详细说明
- 对于注释的要求:准确反映设计思想和代码逻辑;描述业务含义,别的程序员能理解代码背后信息
- 代码修改同时修改注释
安全规约
- 内部文件不外传
- 公司内网WiFi地址密码不外传
- 禁止私自操作生产数据库
- 禁止私自将数据库设计用户信息数据下载到本地
参考资料
《阿里巴巴Java开发手册》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧