alibaba java 开发手册笔记

  1. 前言

阿里巴巴java开发手册,这个pdf一直放在电脑中,总是空了看两下就去坐其他的了,这两天闲着无事就静下心来把它看完了,很多规约都已经是开发习惯了就没有写,然后挑了一些自己可能会忽视的,记了下来。算是看完之后的一个笔记吧。

  1. 命名风格:

  1. 【参考】各层命名规约:Service/DAO层方法命名规约
    1. 1) 获取单个对象的方法用get作前缀。
    2. 2) 获取多个对象的方法用list作前缀。
    3. 3) 获取统计值的方法用count作前缀。
    4. 4) 插入的方法用save/insert作前缀。
    5. 5) 删除的方法用remove/delete作前缀。
    6. 6) 修改的方法用update作前缀。
  1. B) 领域模型命名规约
    1.  1) 数据对象:xxxDO,xxx即为数据表名。
    2. 2) 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
    3. 3) 展示对象:xxxVO,xxx一般为网页名称。
    4. 4) POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。​
  1. 常量定义:
  1. 常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。

1) 跨应用共享常量:放置在二方库中,通常是client.jar中的constant目录下。

2) 应用内共享常量:放置在一方库中,通常是子模块中的constant目录下。

  1. OOP规范:
  1. 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可

    1. 不能使用过时的类或方法。
      说明:java.net.URLDecoder 中的方法decode(String encodeStr) 这个方法已经过时,应该使用双参数decode(String source, String encode)。接口提供方既然明确是过时接口,那么有义务同时提供新的接口;作为调用方来说,有义务去考证过时方法的新实现是什么。
    2. 关于基本数据类型与包装数据类型的使用标准如下:
      1) 【强制】所有的POJO类属性必须使用包装数据类型。
      2) 【强制】RPC方法的返回值和参数必须使用包装数据类型。
      3) 【推荐】所有的局部变量使用基本数据类型。

  1. 【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法中。
  2. 【强制】POJO类必须写toString方法。使用IDE中的工具:source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。
    说明:在方法执行抛出异常时,可以直接调用POJO的toString()方法打印其属性值,便于排查问题。
  1. 集合处理
  1. 【推荐】使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。
    说明:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.forEach方法。
    正例:values()返回的是V值集合,是一个list集合对象;keySet()返回的是K值集合,是一个Set集合对象;entrySet()返回的是K-V值组合集合。
  1. 【参考】合理利用好集合的有序性(sort)和稳定性(order),避免集合的无序性(unsort)和不稳定性(unorder)带来的负面影响。
    说明:有序性是指遍历的结果是按某种比较规则依次排列的。稳定性指集合每次遍历的元素次序是一定的。如:ArrayList是order/unsort;HashMap是unorder/unsort;TreeSet是order/sort。
  1. 并发处理
  1. 创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。

public class TimerTaskThread extends Thread {      

        public TimerTaskThread() {      

              super.setName("TimerTaskThread");   

              ...

        }

}

  1. 【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
    说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
  2. 【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
    说明:Executors返回的线程池对象的弊端如下:
    1)FixedThreadPool和SingleThreadPool:   允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
    2)CachedThreadPool和ScheduledThreadPool:   允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
  3. 【强制】在高并发场景中,避免使用”等于”判断作为中断或退出的条件。
    说明:如果并发控制没有处理好,容易产生等值判断被“击穿”的情况,使用大于或小于的区间判断条件来代替。
    反例:判断剩余奖品数量等于0时,终止发放奖品,但因为并发处理错误导致奖品数量瞬间变成了负数,这样的话,活动无法终止。
  1. 建表规约
  1. 【强制】表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint( 1表示是,0表示否)。
    说明:任何字段如果为非负数,必须是unsigned。
    正例:表达逻辑删除的字段名is_deleted,1表示删除,0表示未删除。

  1. 【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎,重考虑。
    说明:MySQL在Windows下不区分大小写,但在Linux下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。

  1. 【强制】主键索引名为pk字段名;唯一索引名为uk字段名;普通索引名则为idx_字段名。
    说明:pk 即primary key;uk 即 unique key;idx_ 即index的简称。
  2. 【强制】表必备三字段:id, gmt_create, gmt_modified。
    说明:其中id必为主键,类型为unsigned bigint、单表时自增、步长为1。gmt_create, gmt_modified的类型均为datetime类型,前者现在时表示主动创建,后者过去分词表示被动更新.
  3. 【强制】业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。
    说明:不要以为唯一索引影响了insert速度,这个速度损耗可以忽略,但提高查找速度是明显的;另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生。
  4. 【推荐】如果有order by的场景,请注意利用索引的有序性。order by 最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现file_sort的情况,影响查询性能。
    正例:where a=? and b=? order by c; 索引:a_b_c
    反例:索引中有范围查找,那么索引有序性无法利用,如:WHERE a>10 ORDER BY b; 索引a_b无法排序。
  5. 【强制】count(distinct col) 计算该列除NULL之外的不重复行数,注意 count(distinct col1, col2) 如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0。

说明:count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行。

  1. 【参考】 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但TRUNCATE无事务且不触发trigger,有可能造成事故,故不建议在开发代码中使用此语句。
    说明:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。

  1. 【强制】在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。
    说明:1)增加查询分析器解析成本。2)增减字段容易与resultMap配置不一致。
  2. 【强制】POJO类的布尔属性不能加is,而数据库字段必须加is_,要求在resultMap中进行字段与属性之间的映射。
    说明:参见定义POJO类以及数据库字段定义规定,在中增加映射,是必须的。在MyBatis Generator生成的代码中,需要进行对应的修改。
  1. 应用分层
  1. 【参考】分层领域模型规约:
  • DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
  • DTO(Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
  • BO(Business Object):业务对象。由Service层输出的封装业务逻辑的对象。
  • AO(Application Object):应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
  • VO(View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。
  • Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输。
  1. 【强制】线上应用不要依赖SNAPSHOT版本(安全包除外)。
    说明:不依赖SNAPSHOT版本是保证应用发布的幂等性。另外,也可以加快编译时的打包构建。

阿里巴巴java开发手册在线版:阿里巴巴Java开发手册 · 语雀

最后:

CSDN的编辑功能真的好傻逼啊,你们要是不会做,可以不做,我好好的一个格式,复制过来没用,然后我还无法用CSDN的格式给调整好,我佛啦。我搞了半个小时,越搞越生气,浪费我半个小时的时间!真的太傻逼了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值