读《阿里巴巴Java开发手册》有感
作为一名高级Java攻城狮,对于《阿里巴巴Java开发手册》应该并不陌生。
它强调的是码出高效,码出质量,并非是消灭代码的创造性、优雅性,而是限制过度个性化,提高效率。
我个人觉得,它的作用是进化程序员,就算阿里没有出本手册,其他有影响力的公司也会力挺而出,目前,google也有Java开发手册,Google Java编程风格指南。
全文大致包括:
1、编程规约
1.1、命名风格
1.2、常量定义
1.3、代码格式
1.4、OOP规范
1.5、集合处理
1.6、并发处理
1.7、控制语句
1.8、注释规约
1.9、其他
2、异常日志
2.1、异常处理
2.2、日志规约
3、单元测试
4、安全规约
5、MySQL数据库
5.1、建表规约
5.2、索引规约
5.3、SQL语句
5.4、ORM映射
6、工程结构
6.1、应用分层
6.2、二方库依赖
6.3、服务器
以下是我个人觉得这本手册比较好的几个点,并非所有人都如此,可以借鉴一下:
编程规约
- 【强制】String[] args并非String args[]
- 【强制】POJO杜绝is
- 【强制】包名小写,单数形式,但类名可以以复数形式,比如util并非utils
- 【推荐】接口不加修饰符,public也不要,保持代码简洁,有Javadoc注释,尽量不在接口定义变量
- 【参考】获取单个对象->getXxx()
- 【参考】获取多个对象->listXxx()
- 【参考】统计值->countXxx()
- 【参考】插入->saveXxx()(推荐)或insertXxx()
- 【参考】删除->removeXxx()(推荐)或deleteXxx()
- 【参考】修改->updateXxx()
- 【强制】所有相同类型包装类之间值的比较,equals
- 【推荐】调用String.split时,需要对最后一个分隔符有无内容检查,否则会有抛IndexOutOfBoundsException的风险
- 【强制】只要重写equals就必须重写hashCode
- 【强制】操作ArrayList的subList,其实subList是一个视图,所有的操作都会映射到原有的ArrayList;在subList使用中,操作原List,会在使用subList抛ConcurrentModificationException
- 【强制】集合转数组,必须用toArray(T[] array)
- 【强制】数组转集合,使用Arrays.asList(),转换完集合后调用add/remove/clear会抛UnsupportedOperationException
- 【强制】不能再foreach里面对元素的add/remove
- 【推荐】集合初始化尽量指定大小
- 【推荐】使用entrySet遍历Map,而不是用keySet遍历
- 【强制】线程资源必须由线程池提供,禁止自行显示创建线程
- 【强制】if/else/for/while/do必须使用大括号
- 【推荐】if里面尽量使用可读性较高的代码片段或变量
- 【强制】类、类属性、类方法的注释必须使用Javadoc规范,/**内容*/
- 【强制】所有的类必须有创建者信息
- 【强制】所有的枚举类型字段必须有注释,说明每个数据项的用途
- 【强制】修改代码的同时,切记勿忘修改相关注释,否则会使得代码可读性非常低
- 【推荐】注释掉的代码要有配合说明
- 【强制】注释是写给自己看的,也是写给别人看的,切记简单易懂
- 【强制】获取当前毫秒System.currentTimeMillis(),而不是new Date().getTime(),纳秒级System.nanoTime()
异常日志
- 【强制】禁止对大段代码try-catch。
- 【强制】防止NPE,是程序员最基本的修养
安全规约
- 【强制】隶属于个人页面或者功能必须权限校验
- 【强制】用户敏感信息禁止直接展示,必须对数据进行脱敏
- 【强制】用户传入的任何参数必须做有效性的校验
- 【强制】禁止向页面输出未经安全过滤或未正确转义的用户数据
- 【强制】使用平台资源一定要防重放限制
- 【推荐】发帖,评论,发送即时消息等用户生成内容的场景必须实现防刷,文本内容违禁词过滤等风控策略
MySQL
- 【强制】表达是否概念的字段,必须以is_xxx的方式命名,数据类型为unsigned tinyint
- 【强制】表名不使用用复数
- 【强制】主键索引名为pk_字段名;唯一索引名为uk_字段名;普通索引名为idx_字段名
- 【强制】小数类型为decimal,禁止使用float和double
- 【强制】如果存储的字符串长度几乎相等,使用char定长字符串类型
- 【强制】varchar长度不超过5000,如果大于,使用text
- 【推荐】表名最好使用“业务名称_表的作用”
- 【推荐】库名尽量与应用名一致
- 【强制】如果修改字段含义或状态追加,必须更新注释
- 【推荐】单表超过500w或单表容量超过20G,才推荐分库分表(预计三年数据量达不到标准,不要在建表时分库分表)
索引
- 【强制】业务上具有唯一特性的字段,即使是多个字段的组合,也必须建立唯一索引
- 【强制】超过3个表禁止JOIN(即使双表JOIN也要注意表索引、SQL性能)
- 【强制】页面搜索禁止左模糊或者全模糊匹配
SQL
- 【强制】禁止使用count(列名)或者count(常量)来代替count(*)
- 【强制】使用ISNULL()来判断是否为NULL值
- 【强制】禁止使用外键,一切外检概念必须在应用层解决
- 【强制】禁止使用存储过程
- 【强制】数据订正时,删除和修改记录时,要先select,避免出现误删
- 【推荐】in操作能避免则避免,不能避免则必须保证in后面的集合数量不超过1000
ORM
- 【强制】在表查询中,一律不要使用 * 代替字段查询字段
- 【强制】POJO类的boolean值不加is,数据库必须加,在resultMap进行字段和属性的映射
- 【强制】sql.xml配置参数用#{}、#param#,不要使用${},容易出现SQL注入
- 【参考】@Transactional事务不要滥用
以上的【强制】【推荐】【参考】有些做过改动,并非与《阿里巴巴Java开发手册》一致,严格要求自己才能使自己做的更好!
对数据库的了解甚少,所以在此书学到数据库相关的还是比较多的,接下来会深入学习mysql,因为我觉得这是作为架构师的一种必备能力,SQL能力一定要强,名字已经想好,就叫《千锤百炼的SQL》!
笔记是写给自己看的,技术是分享给他人的
立刻有
赞