0. 前言

本文来自《阿里巴巴Java开发手册》,以下内容均根据自己偏好摘抄、总结、分享。


1. 编程规约

  • 包名单数,类名复数。例如:com.tao.util.JsonUtils.java
  • 不要使用一个类来维护所有的常量,要根据功能进行分类。例如:
    • 缓存常量类:CacheConsts
    • 配置常量类:ConfigConsts
  • Objectequals容易抛出空指针,推荐使用 java.util.Objects#equals
    public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
    }
  • String#split 会丢弃后面的空白。例如:"1,2,,," => ["1","2"]
  • Collections#emptyList()/singletonList() 都是不可变对象,不能添加删除元素。
  • ArrayListsubList 返回的内部类 SubList,并不是 ArrayList,而是 ArrayList 的一个视图,操作 subListArrayList 数据也会跟着变化。
  • 如果 if 语句条件复杂,可以复制给一个变量。
  • 批量操作接口入参需要进行保护,超过多少条不进行处理。
  • 参数校验:
    • 很少进行执行的,参数校验也不会耗费多少性能。
    • 执行时间开销大的,执行时间长,尽可能保证别执行一半出错了。
    • 需要稳定性高的,如银行系统,必须进行参数校验,不稳定,损失的都是真金白银。
    • 对外提供的开放接口,不知道别人会给你传过来什么数据,脏数据不处理,你的系统就成垃圾场了。
    • 权限敏感接口,参数校验失败,出现删库跑路。

2. 异常日志

  • 细粒度处理异常,不要 catch 一大段(catch 一大段,你很难知道什么地方抛出了异常,从而很难进行正确的异常处理)。
  • 可以使用 warn 记录用户输入参数的错误情况,如非必要不要再此场景打出 error 级别,error 只记录系统逻辑出错、异常等重要的错误信息。(比如用户数据参数错误,你给了"xxx 参数不正确"的返回,此场景不需要打 error,用户能根据错误提示进行修正。)

3. 单元测试

  • 对数据库的操作应该设置回滚操作,单元测试不应该污染数据库,且单元测试的数据应该使用单元测试的标识,方便区分。

4. 安全规约

  • 用户请求传入的任何参数必须做有效的验证:

    • pageSize 过大容易导致内存溢出。
    • 恶意使用 orderBy 导致慢查询。
    • 短信、邮件、电话、下单、支付等场景必须实现正确的防重放机制(公司的短信都是先发送到MQ,然后消费者去消费,某次消费者逻辑出现异常,导致消息被重复消费好几遍,还好消费逻辑有校验是否发送过短信,否则一个用户会发送好多遍短信)。

5. MYSQL

建表规约

  • 表达是否概念的字段必须使用 is_xxx 的方式,类型为 unsigned tinyint(1是0否)(is_xxx 仁者见仁智者见智)。
  • 表名不使用复数的形式。
  • 单表超过500万才建议分库分表。

索引规约

  • 业务上具有唯一特性,即使多个字段,也必须建成唯一索引。
  • 页面搜索禁止全模糊或左模糊(因为大多数情况,这俩不走索引)。
  • 建组合索引,区分度高的放左边。

语句

  • count(*) 统计null行,count(列名) 不统计null行。
  • 使用 ISNULL 判断是不是null值。
  • 分页逻辑,如果 count=0 直接返回,避免执行后面的分页语句。
  • in 后面的集合元素的个数,最好控制在1000内。
  • 不要写大而全的数据更新接口。
  • @Transactionanl 事务不要滥用,事务会影响数据库的QPS。使用事务要考虑,缓存回滚、消息补偿,统计修正等。

6. 工程结构

  • DO 与数据库表一一对应。
  • DTO:service向外传输的对象。
  • BO:由service输出的封装业务逻辑的对象。
  • Query参数超过2个,需要进行封装。
  • 二方库:
    • JSON:fastjson
    • MD5:commons-codec
    • 数据操作:ArraysUtils
    • 集合操作:CollectionsUtils

7. 总结

以上为看书总结自认为有用的部分,推荐阅读原书。

《Java开发手册》-部分编码规范分享的更多相关文章

  1. 阿里巴巴Java开发手册(命名规范/常量定义篇)——查自己的漏-补自己的缺

    一.编程规约 (一) 命名规约 1. [强制]所有编程相关命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: _name / __name / $Object / name_ / ...

  2. 【Java编码规范】《阿里巴巴Java开发手册(正式版)》【转载】

    2017年开春之际,诚意献上重磅大礼:阿里巴巴Java开发手册,首次公开阿里官方Java代码规范标准.这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率.大大降低代 ...

  3. 阿里官方Java代码规范标准《阿里巴巴Java开发手册 终极版 v1.3.0》

    终极版 v1.3.0 2017年开春之际,阿里诚意献上重磅大礼:<阿里巴巴Java开发手册>,首次公开阿里官方Java代码规范标准.这套Java统一规范标准将有助于提高行业编码规范化水平, ...

  4. 阿里官方Java代码规范标准《阿里巴巴Java开发手册》下载

    https://bbs.aliyun.com/read/306592.html?page=e 2017年开春之际,诚意献上重磅大礼:阿里巴巴Java开发手册,首次公开阿里官方Java代码规范标准. 这 ...

  5. 阿里巴巴Java开发手册正确学习姿势是怎样的?刷新代码规范认知

    很多人都知道,阿里巴巴在2017发布了<阿里巴巴Java开发手册>,前后推出了很多个版本,并在后续推出了与之配套的IDEA插件和书籍. 相信很多Java开发都或多或少看过这份手册,这份手册 ...

  6. 《阿里巴巴Java开发手册》码出高效详解(一)- 为什么要学习阿里编码手册

    <Java 开发手册>(以下简称<手册>)是每个 Java 工程师人手必备的一本参考指南.该手册包括 编程规约.异常日志.单元测试.安全规约.MySQL 数据库.工程结构.设计 ...

  7. 读阿里巴巴Java开发手册v1.2.0之编程规约有感【架构篇】

     不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么 ...

  8. 《阿里巴巴 Java 开发手册》读书笔记

    偶然看到阿里巴巴居然出书了???趁着满减活动(节约节约....)我赶紧买来准备看看,刚拿到的时候掂量了好多下,总觉得商家给我少发了一本书,结果打开才知道..原来这本书这么小.... 编码规范的重要性 ...

  9. 《阿里巴巴 Java开发手册》读后感

    前言 只有光头才能变强 前一阵子一直在学Redis,结果在黄金段位被虐了,暂时升不了段位了,每天都拿不到首胜(好烦). 趁着学校校运会,合理地给自己放了一个小长假,然后就回家了.回到家才发现当时618 ...

  10. 《阿里巴巴Java开发手册》扫描插件正式发布--插件安装和使用分析

    "不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!" 阿里巴巴于10月14日上午9:00在杭州云栖大会<研发效能峰会>上,正式发布<阿里巴巴Java开发 ...

随机推荐

  1. 鸿蒙(HarmonyOS)常见的三种弹窗方式

    最近有一个想法,做一个针对鸿蒙官方API的工具箱项目,介绍常用的控件,以及在项目中如何使用,今天介绍Harmony中如何实现弹窗功能. 警告弹窗 警告弹窗是一个App中非常常用的弹窗,例如: 删除一条 ...

  2. LiveChat vs LiveAgent vs Front vs Email

    它们是什么? LiveChat, LiveAgent 算是同类产品. LiveChat 的核心(或者说起点)是 live chat 这个功能, 而 LiveAgent 的核心是 ticket. 如果拿 ...

  3. 【赵渝强老师】MongoDB中的索引(下)

    (四)索引的类型三:复合索引(Compound Index) MongoDB支持复合索引,即将多个键组合到一起创建索引.该方式称为复合索引,或者也叫组合索引,该方式能够满足多键值匹配查询使用索引的情形 ...

  4. Kernel调试追踪技术之 Kprobe on ARM64

    kprobe是什么? kprobe 是一种动态调试机制,用于debugging,动态跟踪,性能分析,动态修改内核行为等,2004年由IBM发布,是名为Dprobes工具集的底层实现机制[1][2],2 ...

  5. Oracle问题:alter update modify 的区别是什么?

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247486480&idx=1 ...

  6. spring上 -基于注解配置bean,动态代理,AOP笔记

    用的是jdk8,spring框架里jar包的下载可以自己搜到 注解用到的jar包. 60,注解配置Bean快速入门 基本介绍 代码结构: UserDao.java package com.hspedu ...

  7. 云原生周刊:Docker大涨价|2024.10.8

    开源项目推荐 Kubeshark 如果把 K8s 比作操作系统,那它就是 K8s 上的 tcpdump,使用起来就像 Chrome 开发者工具一样简单直接,能够让 K8s 上微服务之间的网络通信一览无 ...

  8. 云原生周刊:一文读懂 Pod 网络 | 2023.4.10

    文章推荐 一文读懂 Pod 网络 这篇文章旨在帮助读者理解 Pod 网络的概念和原理.Pod 网络是 Kubernetes 中的一个重要概念,它描述了如何在一个集群中部署和运行应用程序. Pod 网络 ...

  9. 为什么会有unknown模块

    当一个模块在free后,他的线程仍然在运行时,会导致GetModuleName失败,返回unknown

  10. mongodb副本集群使用总结

    一.该文档仅为了总结经验,方便下次部署时跳过踩过的坑.其中MongoDB的复制原理.特点等参照的菜鸟教程,附地址:https://www.runoob.com/mongodb/mongodb-repl ...