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开发手册》

posted @ 2022-07-05 20:09  Claire_2099  阅读(71)  评论(0编辑  收藏  举报