Java开发手册
2021-07-14 09:34:42 24 举报
AI智能生成
《Java开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,公开到业界后,众多社区开发者踊跃参与,共同打磨完善,系统化地整理成册
作者其他创作
大纲/内容
概论
目前业内代码现状
代码编写紊乱增加人为排查问题难度
数据库表设计不规范白白增加系统开销、系统运行速度低下
命名、工程设计结构混乱,增加后期维护难度
代码存在安全漏洞,增加攻击风险
本书目的
码出高效
码出质量
开发插件
eclipse插件
https://github.com/alibaba/p3c/tree/master/eclipse-plugin
idea插件
https://github.com/alibaba/p3c/tree/master/idea-plugin
命名、项目及设计规范
命名规范
常量命名规范
常量命名全部大写,以下划线分割
不允许魔法值
Long赋值使用使用大写L
常量仅在一个固定范围内变化用enum来定义
注释规范
类、类属性、方法名必须使用Javadoc
注释保持自解释规则
其他规范
不能以下划线或者美元符号开始或者结束
不能使用中英混合方式
不能使用种族歧视词语
类型使用UpperCamelCase格式,方法名、参数名使用lowerCamelCase格式
抽象类使用Abstrat或者Base开头,异常类使用Exception结尾,测试类使用Test结尾
数组要和类型紧挨在一起
pojo类不能使用is作为前缀
包名使用同一小写
避免父子类之间使用完全相同的命名
表示类型的名字放在词尾
如果使用了设计模式,要在类名中体现
枚举类成员全部大写
领域模型命名:DO/DTO/VO等
格式规范
代码格式规范
采用4个空格缩进,禁止使用tab字符
idea设置use tab character
eclipse设置insert spaces for tabs
ide的file encoding设置为utf-8,ide中文换行符使用unix格式
项目规范
Xms和Xmx建议一致
-XX:+HeapDumpOnOutOfMemoryError,设置后jvm遇到oom场景输出dump信息
内部重定向使用
设计规范
应用分层
终端显示层、开放api层
请求处理层(web层)
业务逻辑层(Service层)
通用逻辑层(Manager层)
DAO层、第三方服务
数据存储系统、外部数据接口
领域模型
DO:与数据库表一一对应
DTO:数据传输对象
BO:业务对象
Query:数据查询对象
VO:显示层对象
实施规范
Java开发规范
面向对象规范
避免通过类的对象访问类的静态变量或静态方法
所有的覆盖方法使用@Override
equals方法容易抛出空指针异常,应该使用Objects.equals
Integer对象比较,使用equals方法来比较
浮点数之间的等值判断,基金数据类型不能用==,包装类型不能用equals
BigDecimal的等值比较使用compareTo
禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象
所有的POJO和RPC调用必须使用包装数据类型
变更serialVersionUID需要考虑兼容性,新增属性时请不要修改值
构造中的业务逻辑放入init方法中
split方法需要对最后一个分隔符后有无内容进行检查,否则会出现下标越界风险
勿使用Object的clone方法来拷贝对象
日期处理规范
pattern中使用小写的yyyy
大写M=月份,小写m=分钟
H=24小时,h=12小时
集合规范
重写equals必须重写hashcode
String因为重写了hashcode和equals,所以可以将String对象作为key来使用
ArrayList的subList方法返回是内部类SubList,强转为ArrayList会抛出异常
Map的keyset、values、entrySet方法,不可对其进行添加元素操作,否则抛出UnsupportOperationException异常
集合转数组:list.toArray(new String[0])
不要在foreach循环中对元素进行add/remove操作(建议使用iterator)
比较实现类需要满足:可逆性、传递性
Map不能kv不能存储null的情况
hashtable:kv都不允许为null、线程安全
concurrentHashMap:kv都不允许为null,锁分段技术
treemap:key不允许为null,value允许为null,线程不安全
hashmap:kv都允许为null,线程不安全
合理利用有序和稳定
arraylist:order/unsort
hashmap: unorder/unsort
treeset: order/sort
并发规范
资源驱动类、工具类、单例工厂需要注意线程安全问题
创建线程或者线程池请指定有意义的线程名称
线程资源必须有线程池提供
通过ThreadPoolExecutor来创建线程池
时间工具类的替换
SimpleDateFormat->DateTimeFormatter
Instant代替Date
ThreadLocal变量的清理
及时清理自定义ThreadLocal变量
获取锁的方式
1. tryLock
2. try语句
3. finally:unlock
乐观锁悲观锁
如果每次访问的冲突概率小于20%,推荐使用乐观锁
资金相关使用悲观锁:一锁二判三更新四释放
volitale
使用volatile修饰双重校验锁对象
如果是多写情况使用LongAdder进行加减操作
条件控制规范
switch语句需要加上default
如果判断string对象,需要进行空判断
if必须使用大括号修饰
尽量使用正想逻辑写法
SQL规范
表设计规范
小数类型统一为decimal
存储长度几乎固定,使用char
使用varchar长度超过5000,需要独立一张表出来
表必备3个字段:id,create_time,update_time
如果对状态追加值,需要及时更新字段注释
索引设计规范
命名规范
主键:pk_
唯一约束:uk_
普通索引:idx_
索引优化的目标:consts(只有一个匹配)、ref(普通索引)、range(对索引的范围检索)
sql语句规范
表名和字段名统一小写
不要使用count(列名)/count(常量)代替count(*)
@Transactional事务不要滥用,影响qps,另外要考虑回滚、消息补偿、统计修正等
ibatis标签
isEqual一般是数字之间的比较
isNotEmpty表示不为空且不为null
isNotNull表示不为null的值
异常处理规范
定义错误码快速溯源
避免随意定义新的错误码
不能直接抛出常见npe、ioobe异常
不要在finally中写return语句
安全规范
所有属于用户的页面和信息,需要做权限限制
用户敏感数据必须进行脱敏
用户输入参数必须做有效性验证
必须执行CSRF安全校验
使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重复机制
测试规范
遵循AIR原则
单元测试写在src/test/java下
语句覆盖率达到70%
单元测试代码遵循BCDE原则
数据准备要通过程序生成,不要通过手动输入的方式
读后感悟
这是一本不错的开发指南,当然具体使用过程中需要结合项目实际情况,灵活运用。
0 条评论
下一页