一、编程规约
(一)命名风格
1.禁止拼音、英文混合,杜绝单词缩写;
2.类名:大驼峰;方法名、参数名、成员变量、局部变量:小驼峰;包名统一小写
3.抽象类使用Abstract或Base开头;异常类以Exception结尾;测试类以Test结尾;
4.数组:类型与[]紧挨,int[];
5.POJO类中任何布尔类型的变量,都不要加is前缀;
6.避免在子父类的成员变量之间、或者不同代码块的局部变量之间采用完全相同的命名;
7.如果模块、接口、类、方法使用了设计模式,在命名是需体现具体模式,如OrderFactory;
8.接口中方法、属性不加修饰符;无变量,定义常量;
9.接口与实现类命名规则:①impl
②如果是形容能力的接口:AbstractTranslator 实现 Translatable接口
10.枚举类名加上Enum,枚举成员名称需要全大写,单词间用下划线隔开(特殊常量,构造方法私有)
11.各层命名规约:
(1)Service/DAO方法命名:
获取单个对象方法用get前缀;获取多个对象方法用list前缀,复数结尾;获取统计值count前缀;插入方法用save/insert前缀;删除用remove/delete前缀;修改用update前缀
(2)领域模型命名规约
数据对象:xxxDO xxx为数据表名
数据传输对象:xxxDTO xxx为业务领域相关名称
展示对象:xxxVO xxx一般为网页名
POJO是DO/DTO/BO(业务对象)/VO的统称,禁止命名成 xxxPOJO
(二)常量定义
1.不允许出现魔法值:未经预先定义的常量;
2.long或Long类型赋值时后缀用L,小写易混淆;
3.常量存放:
4.如果变量值仅在固定范围内变化,用enum类型定义;
(三)代码格式
1.右大括号后还有else等代码则不换行,表示终止的右大括号必须换行
2.保留字与括号加空格,运算符前后加空格,4个空格缩进;
3.左小括号和右边相邻字符无空格,右小括号和左边相邻字符无空格;
4.强转时右括号右边不用空格
5.换行:运算符与下文一起换行;括号前不要换行;参数换行在逗号后;
6.多个参数逗号后加空格;
(四)OOP规约
1.直接类名调用静态资源
2.覆写的方法加@Override
3.接口过时必须加@Deprecated注解,说明新接口或新服务是什么
4.Object的equals方法容易抛空指针异常,Integer类型对象用equals方法比较;
5.任何货币金额均以最小货币单位且整型类型来存储
6.浮点数的判断:基本类型不能用==,包装类型不能用equals;可指定误差范围(
绝对值:Math.abs(x) ),或用BigDecimal定义值并用compareTo()比较;
7.定义数据对象DO类时,属性类型与字段类型匹配,数据库bigint对应类Long类型
8.double转BigDecimal的两种方式:
1.BigDecimal.valueOf(double数据)
2.new BigDecimal( String.valueOf(double数据) )
9.POJO类属性、RPC方法的返回值和参数必须使用包装类型;局部变量使用基本类型;
10.定义POJO类是不要设定任何默认值
11.禁止在POJO类中,同时存在对应属性的isXxx()和getXxx()方法;
12.使用索引访问使用String的split分割得到的数组时,须佐最后一个分隔符后有无内容的检查,否则会抛IndexOutOfBoundsException的风险
13.类内方法定义顺序:公有方法或保护方法>私有方法>getter/setter
14.循环体内字符串拼接用StringBuilder的append方法
(五)日期时间
1.日期格式化时,年份使用小写y,yyyy表示当天所在的年,YYYY表示当天所在的周属于的年份,周日开始周六结束,只要本周跨年,返回的就是下一年
2.M表示鱼粉,m表示分钟,H表示24小时制,h表示12小时制
表示日期和时间的格式如下所示:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
3.获取当前毫秒数:System.currentTimeMillis();在JDK8中,针对统计时间等场景,推荐使用Instant类
4.获取今年的天数:LocalDate.now().lengthOfYear();
获取指定某年(2011)的天数:LocalDate.of(2011.1.1).lengthOfYear();
5.使用枚举值来指代月份。如果使用数字,注意Date,Calendar等日期相关类的月份取值在0-11间
(六)集合处理
1.如果自定义对象作为Map的键,那么必须重写hashCode和equals
2.判断所有集合内部的元素是否为空,使用isEmpty()
3.java.util.stream.collectors中的toMap()是将聚合元素重新组装为Map结构,toConcurrentMap()返回ConcurrentMap(线程安全的Map结构),要使用有参数类型为BinaryOperator,参数名为margeFunction的方法,否则当出现相同的key时会怕抛出IllegalStateException,当value为null时会抛出NPE异常
4.ArraryList的subList结果不可强转成ArraryList,否则会抛出ClassCastException(类型间转换不兼容)
5.使用Map的方法keySet()/values()/entrySet()返回集合对象时,不可以对其进行添加元素操作,否则会抛出UnsupportedOperationException异常
6.Collections类返回的对象,如:emptyList()/singletonList()等都是immutable(不可改变) list,不可对其进行添加或者删除元素的操作,会抛出UnsupportedOperationException异常
7.在subList场景中,高度注意对父集合元素的增加或删除,会导致子列表的遍历、增加、删除产生ConcurrentModificationException异常(并发修改异常)
8.集合转数组:必须使用集合的toArray(T[] array),传入的时类型完全一致、长度为0的空数组;若直接使用toArray无参方法,返回值时Object[],若强转会出现ClassCastException; 使用:String[] array = list.toArray(new String[0]);
9.在使用addAll()方法时,对输入的集合参数进行NPE(NullPointException)判断;
10.使用工具类Arrays.asList()把数组转换成集合,不能使用其修改集合相关的方法,会抛出UnsupportedOperationException异常。asList()的返回对象是一个Arrays内部类,并没有实现集合的修改方法;
11.不要在foreach循环里进行元素的remove/add操作,要使用Iterator方式;
(七)并发处理
1.线程资源必须通过线程池提供,线程池不允许使用Exexutors创建,通过ThreadPoolExecutor创建;
2.JDK8中,Instant代替Date , LocalDateTime代替Calendar, DateTimeFormatter代替SimpleDateFormate;
3.锁。。。
(八)控制语句
1.switch语句变量类型为String类型时进行null值判断
2.在高并发场景中,避免使用”等于”判断作为终端或瑞出条件,容易产生“击穿”情况
(九)注释规约
(十)前后端规约
1.请求方法:get:获取资源 post:新建资源 put:更新资源 delete:删除资源
2.前后端的时间格式统一为“yyyy-MM-dd HH:mm:ss”
(十一)其他
二、MySQL数据库
(一)建表规约
1.表名、字段名必须使用小写字母或数字,禁止数字开头,禁止两个下划线中间只出现数字
2.主键索引名为pk_字段名,唯一索引为uk_字段名,普通索引为idx_字段名
3.小数类型为decimal
4.varchar可变长字符串,航都不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应。
5.表必备三字段:id ,create_time,update_time
(二)索引规约
(三)SQL语句
1.不要使用count(列名)替代count(*),统计行数的标准语法,与null值无关
2.使用isNull()来判断是否为null值