阿里巴巴编码规范(JAVA)认证考后感
编码规范
- 定义DO / DTO / VO 等POJO类时, 不要设定任何属性默认值。
- 所有的覆写方法必须添加@override注解;
- 类型与中括号紧挨相连来表示数组。
int[] arrayDemo
,而不要int arrayDemo[]
。 - 不要在接口里定义变量。
- 不要在括号、逗号前换行。
- 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。
- 相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object。可变参数必须放置在参数列表的最后。 (提倡同学们尽量不用可变参数编程)
- 外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生影响。接口过时必须加@Deprecated 注解,并清晰地说明采用的新接口或者新服务是什么。
- 推荐使用 java.util.Objects#equals。
概念
if语句使用卫语句减少层级嵌套。
卫语句就是把复杂的条件表达式拆分成多个条件表达式,比如一个很复杂的表达式,嵌套好几层的if - then-else语句,转换为多个if语句,实现它的逻辑,这多条的if语句就是卫语句。
if(obj != null){
doSomething();
}
转换成卫语句以后的代码如下:
if(obj == null){
return;
}
doSomething();
参考:
https://blog.csdn.net/Soumns_Kris/article/details/78390492
https://blog.csdn.net/jw903/article/details/45506777
单元测试
白盒测试中的代码覆盖率种类:语句覆盖、分支覆盖(判定覆盖)、条件覆盖、路径覆盖。语句覆盖是最弱的一种度量方式,即使是路径覆盖也不能保证程序完全没问题。
数据库
- NULL与任何值比较的结果都为NULL。使用 ISNULL()来判断是否为 NULL 值。
- 索引中有范围查找,那么索引有序性无法利用,如: WHERE a>10 ORDER BY b; 索引 a_b 无法排序。
- 在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为 20 的索引,区分度会高达 90%以上,可以使用
count(distinct left(列名, 索引长度))/count(*)
的区分度来确定。 - 利用覆盖索引来进行查询操作, 避免回表。能够建立索引的种类分为主键索引、唯一索引、普通索引三种,而覆盖索引只是一种查询的一种效果,用 explain 的结果, extra 列会出现: using index.
- 利用延迟关联或者子查询优化超多分页场景。先快速定位需要获取的 id 段,然后再关联:
SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id
- SQL 性能优化的目标:至少要达到 range 级别, 要求是 ref 级别, 如果可以是 consts 最好。1)consts 单表中最多只有一个匹配行(主键或者唯一索引) ,在优化阶段即可读取到数据。2) ref 指的是使用普通的索引(normal index) 。3) range 对索引进行范围检索。explain 表的结果, type=index,索引物理文件全扫描,速度非常慢,这个 index 级别比较 range 还低,与全表扫描是小巫见大巫。
- 防止因字段类型不同造成的隐式转换, 导致索引失效。
- 建组合索引的时候,区分度最高的在最左边。存在非等号和等号混合时,在建索引时,请把等号条件的列前置。
- 不要使用 count(列名)或 count(常量)来替代
count(*)
。count(*)
是 SQL 92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。count(*)
会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。 - 避免 sum 的 NPE 问题:
SELECT IF(ISNULL(SUM(g)),0,SUM(g)) FROM table
。 - TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务且不触发 trigger,有可能造成事故,故不建议在开发代码中使用此语句。TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。
- 在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。哪怕是极端情况下,需要查询实体类/表的所有字段,也不准使用 * 。
<isEqual>
中的 compareValue 是与属性值对比的常量,一般是数字,表示相等时带上此条件;<isNotEmpty>
表示不为空且不为 null 时执行;<isNotNull>
表示不为 null 值时执行。- 不得使用外键与级联,一切外键概念必须在应用层解决。外键与级联更新适用于单机低并发,不适合分布式、高并发集群; 级联更新是强阻塞,存在数据库更新风暴的风险; 外键影响数据库的插入速度。
其他
应用服务器一般都带有连接池功能,故而应用服务器与数据库之间的是长连接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix