阅读笔记——《阿里巴巴Java开发规范》

前言

本文是《阿里巴巴Java开发规范》的阅读笔记,主要记录目前阶段不太熟悉和容易犯错的点:

正文

表示类型的名词放在词尾,以提升辨识度;比如startTime, workQueue, nameList等;

所有的POJO的属性都需要使用包装类型;

使用Map#keySet或entrySet的返回值时,不要添加元素,否则会抛出异常;

Arrays.asList同样也不能修改集合;

ConcurrentHasMap,key和value都不可以为null,HashMap,key和value都可以为null;

在使用阻塞等待得到锁的方式中,必须在try代码块之外,并且加锁方法在try代码块之间没有可能抛出异常的方法调用;

  1. 如果中间抛出异常,则锁无法被正常释放;
  2. 如果lock方法在try代码块之内,其他方法可能抛出异常会导致unlock了原本没有获取到锁的对象;
  3. 如果lock方法抛出unchecked异常,则异常情况同第二点;

在使用尝试获取锁的方式中,在执行后续流程前需要判断线程是否获取了锁;

  • 执行lock对象的unlock方法,同样如果没有持有锁,则会抛出异常;

如果每次访问冲突概率小于20%,则推荐使用乐观锁,否则使用悲观锁。(如何获取访问冲突概率呢?)

乐观锁的重试次数不得小于3次;

三目表达式:condition ? variable1 : variable2;表达式1和表达式2在类型对齐时,可能抛出自动拆箱的NPE异常;

java 复制代码
int a = 1;
int b = 2;
Integer c = null;

Boolean flag = false;
Integer result = flag ? a * b : c;

System.out.println(result);

以下两点可能会出现拆箱操作:

  1. a,b的值有一个是原始类型;
  2. a或者b的值类型不一致,会强制拆箱升级为范围更大的那个类型;

在高并发场景下,避免使用"等于"语义来判断中断和退出; >=0或<=0;

FIXME:标识某代码是错误的,而且不能工作,需要及时纠正的情况;

对于需要使用超大整数的场景,服务端一律使用String字符串类型返回,禁止返回Long,前端会有将Long转化为Number,存在着精度损失;

集合即使是isNotEmpty,取出来的元素也有可能是null;

打印日志的时候,禁止使用JSON工具将对象转换为String;避免某些工具会因为实体缺少字段抛出异常导致正常业务无法进行;

可以使用warn日志级别记录用户输入参数错误的情况,来应对客诉;

任何字段如果为非负数,则必须是unsigned;

小数类型为decimal,禁止使用float和double类型;

当单表行数超过500万或者单表容量超过2GB时,再考虑分库分表;

在varchar字段建立索引时,必须指定索引长度,没必要对全字段建立索引;

如果有order by的场景,order by最后的字段是组合索引的一部分;

利用延迟关联(一个查询分解为多个小查询)或者子查询优化超多分页场景;

MySQL不是跳过offset行,而是取offset+N行,然后返回放弃前offset行,返回N行;

下述操作很耗时

sql 复制代码
select * from book limit 340000, 20;

优化一:使用主键优化,尝试传入上一次的id来优化查询

sql 复制代码
select * from book where id > #{last_id} limit 20;

优化二:使用子查询+覆盖索引优化

sql 复制代码
SELECT * FROM t1 as a INNER JOIN (SELECT id FROM t2 LIMIT 3400000,20) as b USING (id);

覆盖索引:MySQL如果查询完全覆盖索引,查询是很快的;

count(*)是统计值为NULL的行,而count(列名)不会统计该列为NULL的行;

当某一列的值全部为NULL时,count(column)会返回0,而sum(column)会返回NULL,所以使用sum需要注意NPE;

POJO的布尔属性不能加上is,而数据库字段必须加上is_xxx,要求在resultMap中做字段属性的映射;

BO(Bussiness Object):业务对象,可以由Service层输出的封装业务逻辑的对象;

相关推荐
Anastasiozzzz几秒前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人2 分钟前
通过脚本推送Docker镜像
java·docker·容器
刘琦沛在进步5 分钟前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
Hello_Embed6 分钟前
libmodbus 移植 STM32(USB 串口后端篇)
笔记·stm32·单片机·嵌入式·freertos·libmodbus
张祥64228890415 分钟前
RTKLIB源码和理论结合分析笔记三
笔记
机器视觉的发动机16 分钟前
AI算力中心的能耗挑战与未来破局之路
开发语言·人工智能·自动化·视觉检测·机器视觉
铁蛋AI编程实战19 分钟前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
日更嵌入式的打工仔24 分钟前
0欧电阻作用
笔记
HyperAI超神经24 分钟前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新
晚霞的不甘30 分钟前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频