阿里 Java 开发手册的思考总结

一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。

-- 毕玄

1. 命名风格

【书摘】类名用 UpperCamelCase 风格,比如 DO/BO/VO/PO

【书摘】方法用 lowerCamelCase 风格,尽量是动词

小思考:例如常用的

  • 获取单个对象,getUserById
  • 获取对象累不,listUserByGroupId
  • 统计对象数量,countUserByClassId
  • 新增、删除,insert,delete,update 等

2. 常量定义

【书摘】如果变量值仅在一个范围变化,则用 enum 类型

小思考:例如电商中订单状态,用手指也能列出来。所以一般定义个 OrderSatausEnum 搞定,伪代码如下:

public enum OrderSatausEnum {
TO_PAY(1,"代付款"), PAID(2,"已付款") ...; private Integer orderStatus;
private String orderSatausDes; OrderSatausEnum(Integer orderStatus,String orderSatausDes) {
this.orderStatus = orderStatus;
this.orderSatausDes = orderSatausDes;
} // get set
}

进一步,如果订单某天要加个“待拼团”状态咋办?所以这些配置化的东西,可以上配置中心。比如携程出的 apollo 等

3. OOP 规则

【书摘】Object 的 equals 方法容易抛空指针异常,应使用常量或者确定优质的对象来调用 equals 。

比如:“TO_PAY”.equals(order.getOrderStatus())。反着写就不对了,因为 order.getOrderStatus() 可能为 null。

自然,更加推荐 java.util.Objects#equals 工具类。

【书摘】所有相同类型的包装类对象之间的值比较,全部使用 equals 方法。

小思考:别用 == 了。equals 也要注意些事情,比如 Byte 类型的 status 对象值,用 equals 要注意如下:

getStatus().equals(0) // 反例,false
getStatus().equals((byte)0) // 正例,true

还有, == 比如 Integer 在 -128 到 127 范围比较正常,超过就不正常。原因是 -128 到 127 范围的对象在 IntegerCache.cache 中产生,会复用对象。所以所以,切记切记,别用 == 了,用 equals 去比较。

4. 集合处理

【书摘】不要在 for 循环中进行元素的 remove/add 操作。remove 请使用 Iterator 方法,如果有并发操作,则对 Iterator 对象加锁。

具体 Iterator 怎么操作集合,百度下即可。这还是典型的 迭代器设计模式,可以深入源码看看人家的简单实现原理,又能学到一发高级知识。

5. 并发处理

【书摘】第一,线程必须通过线程池来提供,不允许显式创建线程。第二,线程池不允许用 Executors 创建,应使用 ThreadPoolExecutor 去创建。因为

Executors 创建的几种 ThreadPool 会有弊端:

  • FixedThreadPool 和 SingleThreadPool 允许请求队列长度为 Integer.MAX_VALUE ,大量请求,会导致 OOM
  • CachedThreadPool 和 ScheduledThreadPool 允许创建最大的线程数为 Integer.MAX_VALUE,大量创建线程,会导致 OOM

所以,使用 ThreadPoolExecutor 的原因是能更好地理解线程池的运行规则,规避资源耗尽,更好地贴合某个业务场景,去创建更适合的线程池。


【书摘】在高并发场景中,同步调用应该考虑锁的性能损耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。即,加锁的粒度越小,性能损耗越小。并且避免锁的代码块中调用了 RPC 方法。

另外,同时对多个资源加锁的时候,需要保持一致的加锁顺序。否则,一个线程加锁顺序为 ABC,另一个加锁顺序为 ACB 或 BAC 等,会造成死锁。如图:


【书摘】金融资金相关信息,使用悲观锁。比如更新某个用户的钱包余额字段。

小思考:我以前做 P2P 的时候,就很简单地使用了 MySQL 的行锁。

SELECT * FROM xx WHREER xx.id=888 FOR UPDATE

具体行锁,表锁大家可以自行百度了解。

6. 控制语句

【书摘】高并发场景,比如秒杀场景,商品扣库存,库存的判断不要用“等于”来判断商品库存已售罄的条件。应使用大于或者小于的条件来代替。

小思考:这是典型的超卖场景。有人会问也会存在超卖几件的问题吧?答案是是的。但如果用 等于 来判断,超卖的件数会很多很多,比如达到 1 万件。但超卖 1 万件和超卖 1 件是不一样等级的故障。或者是一个故障和一个不是故障的区别。

7.异常处理

【书摘】异常不要用来做流程控制,条件控制

小思考:昨天京东小哥问我,这个能这么搞降级吗?如下代码:

try {
searchFromES()
}catch(){
searchFromDB()
}

这不算降级,这也不能这么搞。第一,代码这也写就不对,异常不要用来做流程控制,条件控制。第二,这个只要实现 ES 读取有问题,读取不到就读 DB。可以考虑责任链设计模式去实现。伪代码如下:


ESHandle {
void handle() {
try {
searchFromES()
}catch(){
}
}
} DBHandle {
void handle() {
try {
searchFromES()
}catch(){
}
}
} // 两个 Handle 利用责任链去实现即可。

8. 建表规约 、SQL 语句

【书摘】当单表行数超过 500 万行或者单表容量超过 2 GB时,才推荐进行分库分表。

如果预计三年后的数量级无法达到这个级别,请不要在创建表时就分库分表。


【书摘】不要使用 count(列名) 或者 count(常量) 来替代 count(*)。 因为它是 SQL92 定义的标准统计行数的预发。它会统计 NULL 的行。


【书摘】where 条件下里面的 in 能避免就避免,要注意 in 里面的集合数量,控制在 1000 个之内。


【书摘】在代码中写分页查询,如果 count 为 0 ,直接返回 空列表。避免执行下面的分页语句。

9.服务器

【书摘】高并发服务器建议调小 TCP 协议的 time_wait 超时时间。Linux 修改 /etc/sysctl.conf 文件,代码如下:

net.ipv4.tcp_fin_timeout = 30

【书摘】JVM 设置参数 -XX:+HeapDumpOnOutOfMemoryError。让 JVM 碰到 OOM 的时候,输出 dump 信息。

小思考:这个很重要。二者得保留事故服务器现场。比如 OOM 了某个服务器,则在 VIP 或者啥摘到该机器,让该机器不再有请求进入。然后去查看 dump 信息,去排查 OOM 问题。

工程师对于代码,一定要精益求精,不论从性能,还是简洁优雅,都要具备精益求精的工匠精神,认真打磨自己的作品。

-- 多隆

本文由博客群发一文多发等运营工具平台 OpenWrite 发布

Java开发手册精华总结的更多相关文章

  1. 2019.05.26 周日--《阿里巴巴 Java 开发手册》精华摘要

    一.写在开头 Java作为一个编程界最流行的语言之一,有着很强的生命力.代码的编写规范也是不容忽视的,今天,我就把自己阅读的国内的互联网巨头阿里巴巴的<阿里巴巴 Java 开发手册>一些精 ...

  2. Java开发最佳实践(二) ——《Java开发手册》之"异常处理、MySQL 数据库"

    二.异常日志 (一) 异常处理 (二) 日志规约 三.单元测试 四.安全规约 五.MySQL数据库 (一) 建表规约 (二) 索引规约 (三) SQL语句 (四) ORM映射 六.工程结构 七.设计规 ...

  3. 《码处高效:Java开发手册》之代码风格

    流水淡,碧天长,鸿雁成行.编码风格,简捷清爽,反引无限风光. 在美剧<硅谷>中有这样一个经典镜头,主人公 Richard 与同为开发工程师的女友闹分手,理由是两人对缩进方式有着截然不同的编 ...

  4. Java开发手册

    <Java开发手册> 基本信息 作者: 桂颖    谷涛    出版社:电子工业出版社 ISBN:9787121209161 上架时间:2013-8-12 出版日期:2013 年7月 开本 ...

  5. 阿里巴巴Java开发手册———个人追加的见解和补充(一)

    先上干货,<阿里巴巴Java开发手册>的下载地址 https://yq.aliyun.com/articles/69327?spm=5176.100239.blogcont69327.15 ...

  6. JUC学习笔记--从阿里Java开发手册学习线程池的正确创建方法

    前言 最近看阿里的 Java开发手册,上面有线程池的一个建议: [强制]线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式, 这样的处理方式让写的同学 ...

  7. 阿里巴巴Java开发手册评述

    2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...

  8. 阿里巴巴Java开发手册快速学习

    Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性. 善医者“未有形而除之”,提高工程健壮性 ...

  9. 《阿里巴巴Java开发手册(正式版》读记

    前几天,阿里巴巴发布了<阿里巴巴Java开发手册(正式版>,第一时间下载阅读了一番. 不同于一般大厂内部的代码规范,阿里巴巴的这本Java开发手册,可谓包罗万象,几乎日常Java开发中方方 ...

  10. 读阿里巴巴Java开发手册v1.2.0之工程结构有感【架构篇】

    首先,把昨天那俩条sql语句的优化原因给大家补充一下,第一条效率极低,第二条优化后的,sql语句截图如下: 经过几个高手的评论和个人的分析: 第一条sql语句查询很慢是因为它首先使用了in关键字查询, ...

随机推荐

  1. umich cv-2-2

    UMICH CV Linear Classifiers 在上一篇博文中,我们讨论了利用损失函数来判断一个权重矩阵的好坏,在这节中我们将讨论如何去找到最优的权重矩阵 想象我们要下到一个峡谷的底部,我们自 ...

  2. 使用go语言开发hive导出工具

    前言 新版 hive 提供了 beeline 工具,可以执行SQL并导出数据,不过操作还是有点复杂的,团队里有些同学不会Linux的基本操作,所以我花了亿点点时间写了个交互式的命令行工具方便使用. 效 ...

  3. 一个简单高效低内存的.NET操作Excel开源框架 - MiniExcel

    前言 日常工作中经常与数据打交道的同学肯定会难以避免对Excel的一些数据操作如导入.导出等,但是当对一些大数据量操作Excel时经常会遇到一个常见的问题内存溢出.今天给大家推荐一个简单.高效.低内存 ...

  4. 2023 SHCTF-校外赛道 Crypto—Wp

    WEEK1 立正 wl hgrfhg 4gNUx4NgQgEUb4NC64NHxZLg636V6CDBiDNUHw8HkapH :jdoi vl vlkw ~xrb wd nrrT Y: 凯撒解密,偏 ...

  5. vue本地能够访问图片,打包项目之后图片无法访问

    //template中 <img :src="boxHerf" /> //js let boxHerf = ref('/src/assets/images/contai ...

  6. java学习内容-1

    java学习内容-1 (一)jdk的使用 (二)定义标识符的规则 (三)java常用类 1.String类 2.Math类 3.Integer和Double类 4.输出 5.Scanner类 例子 ( ...

  7. Web服务器及Web应用服务器

    1. 如果仅需要展示html页面,而不要其他功能,apache:(nginx也是类似功能:它本身仅提供html静态页面的功能,不能支持jsp.java servlet.asp等功能,但通过同其他应用服 ...

  8. easy ui 按钮图标样式合集

    data-options="iconCls:'icon-search'" 可替换以下值 icon-add icon-print icon-mini-add icon-cvs ico ...

  9. DOS(Terminal)常用命令

    DOS是一款在20世纪末期流行的操作系统,它是一款面向磁盘的系统软件.它的用途非常广泛,大名鼎鼎的 Windows 98 就是基于它的.DOS依然活跃,比如FreeDOS. cmd是指命令行提示符,是 ...

  10. In 查询及其优化

      translator Afrikaans Albanian - shqipe Arabic - ‎‫العربية‬‎ Armenian - Հայերէն Azerbaijani - azərb ...