《阿里巴巴 Java 开发手册》核心重点 + 新手必避坑(精简实用版)
目录
一、整体原则(所有代码通用)
二、编程规约(新手重灾区,优先级最高)
1. 命名规范(最基础,面试 / CR 必查)
(1)各类标识符规则
(2)特殊命名约定(企业通用)
2. 格式规范
3. 变量 & 常量
4. 集合使用(新手高频 Bug 点)
5. 控制语句(if/for/switch)
6. 字符串
三、异常处理(新手最乱的模块)
四、MySQL 数据库规约(后端核心,面试 + 工作重点)
1. 建表规范
2. 索引规范(新手性能大坑)
3. SQL 编写规范
4. ORM 层(MyBatis/MyBatis-Plus)
五、工程结构 & 分层规范(项目架构)
六、安全规约(线上必守)
七、性能规约(新手进阶)
二、新手程序员重点注意问题(落地避坑清单)
1. 心态 & 编码习惯(第一位)
2. 每天必检查的代码点(CR 高频问题)
3. 绝对不能犯的低级错误
4. 版本控制 Git 规范(工作必备)
5. 学习建议(新手成长路线)
总结(极简背诵版)
手册分编程规约、异常日志、MySQL、工程结构、安全、性能、设计七大块,下面只讲高频考点、工作必守、新手最容易踩的坑,兼顾理论 + 实操。
一、整体原则(所有代码通用)
- 代码可读 > 炫技优先直白写法,不要写 “一行神仙代码”,新手切忌过度嵌套、简写、花式语法。
- 统一规范 > 个人习惯命名、缩进、注释、格式全团队统一,入职第一件事对齐编码规范。
- 提前防错 > 事后排错空判断、参数校验、边界值、异常捕获,写代码时就考虑健壮性。
二、编程规约(新手重灾区,优先级最高)
1. 命名规范(最基础,面试 / CR 必查)
(1)各类标识符规则
- 包名:小写、连续单词,不用下划线 / 大写 错误:
com.Study_Demo正确:com.studydemo - 类名:大驼峰(UpperCamelCase),名词 正确:
UserService、OrderMapper - 方法 / 变量:小驼峰(lowerCamelCase),动宾结构 错误:
getuser()正确:getUser() - 常量:全大写 + 下划线分隔,
static final正确:public static final int MAX_PAGE = 10; - 枚举:类名大驼峰,枚举值全大写
- 禁止:拼音混合命名、单个字母无意义命名(除临时循环变量
i,j)、中英文混搭。
(2)特殊命名约定(企业通用)
- 接口:后缀
Service / Mapper / Dao / Handler - 实现类:接口名 +
Impl,如UserServiceImpl - 数据实体:
Entity / DO / DTO / VO / BO严格区分(新手必记)- DO:数据库实体,和表一一对应
- DTO:接收前端参数 / 对外传输
- VO:返回给前端展示数据 禁止一个实体到处用(DO 直接返前端、VO 入库)。
2. 格式规范
- 缩进统一4 个空格,禁止用 Tab。
- 左大括号紧跟代码行尾,不单独另起一行。
- 运算符左右加空格,
if/for/while后面必须加空格。 - 单行字符不超过120 字符,超长代码手动换行。
3. 变量 & 常量
- 成员变量、局部变量初始化,避免默认值引发空指针。
- 魔法值(硬编码数字 / 字符串)必须抽成常量。 反面:
if(status == 1)正面:if(status == STATUS_NORMAL) - 禁止使用
float/double做金额计算,必须用BigDecimal。
4. 集合使用(新手高频 Bug 点)
- 初始化集合指定容量已知元素数量,创建
ArrayList时传入初始容量,减少扩容开销。 - 集合判空标准写法统一用工具类:
org.springframework.util.CollectionUtils// 正确 if (!CollectionUtils.isEmpty(list)) // 错误:先判null再判size,冗余且易错 if (list != null && list.size() > 0) - 遍历禁忌
- 不要在
foreach循环里增删元素(触发并发修改异常),要用迭代器。 - 禁止用
fori遍历Set。
- 不要在
- Map 规范
- 推荐
HashMap,线程安全用ConcurrentHashMap,绝对不用 Hashtable。 - 遍历 Map 优先
entrySet,不要多次get(key)。
- 推荐
- 数组转集合陷阱
Arrays.asList()返回的是固定长度集合,不能 add/remove。
5. 控制语句(if/for/switch)
- if 分支
- 少用多层嵌套(超过 3 层就要重构)。
- 优先正向判断、提前 return,减少嵌套。
// 推荐:卫语句 if (user == null) { return; } // 业务逻辑 - switch
- 每个 case 必须写
break,避免穿透。 - 必须加
default分支。
- 每个 case 必须写
- for 循环循环内不要频繁调用方法(如
list.size()),提前提取。
6. 字符串
- 拼接字符串:循环内用StringBuilder,不要直接
+。 - 字符串判空统一工具类:
StringUtils.isBlank()(推荐)/isEmpty()。isBlank:判断 null、空串、全空格isEmpty:只判断 null、空串
- 禁止用
==比较字符串,一律用equals()。 技巧:常量放前面避免空指针:"success".equals(status)
三、异常处理(新手最乱的模块)
- 禁止使用异常做流程控制异常是用来处理意外错误,不是替代 if 判断。
- try-catch 范围要小不要把一整段业务全包在一个大 try 里,难以定位问题。
- 禁止捕获最顶层 Exception 不处理
必须:打印日志 + 向上抛出 / 友好返回。// 反面:吞掉异常,线上问题完全无法排查 try { ... } catch (Exception e) {} - 自定义业务异常项目统一封装自定义异常,不要到处抛原生
RuntimeException。 - finally 块资源释放流、连接、Socket 等资源,优先使用try-with-resources自动关闭(JDK7+),不用手动 finally。
- 日志打印
- 生产环境禁止
System.out.println / e.printStackTrace(),全部用日志框架(SLF4J+Logback)。 - 日志级别区分:
error(错误)、warn(告警)、info(正常流程)、debug(调试)。 - 日志要打印关键参数、请求 ID、用户 ID,方便排查。
- 生产环境禁止
四、MySQL 数据库规约(后端核心,面试 + 工作重点)
1. 建表规范
- 必须字段每张表强制:
id(主键)、create_time、update_time、deleted(逻辑删除)用逻辑删除,禁止物理删除数据。 - 主键主键
id用自增 bigint,不用 uuid(索引效率低)。 - 字段命名下划线命名,和 Java 实体小驼峰映射,禁止拼音。
- 数据类型选择
- 字符串优先
varchar,长度按需定义,不滥用text。 - 手机号、身份证等长文本用
varchar,不用数字类型。 - 时间统一用
datetime,禁止用timestamp(时区 / 范围坑多)。
- 字符串优先
- 禁止保留关键字做字段名(order、user、status 等)。
2. 索引规范(新手性能大坑)
- 主键必建索引,频繁查询、条件筛选字段建索引。
- 联合索引遵循最左匹配原则。
- 禁止过度建索引:索引提升查询、降低增删改速度。
- 索引失效场景(必记):
like %xxx左模糊- 字段隐式类型转换(字符串和数字对比)
or连接无索引字段- 对索引列使用函数、运算
3. SQL 编写规范
- ** 禁止 select *** 只查需要的字段,减少网络传输、避免字段变动出问题。
- 分页必须加
limit,大数据量禁止全表查询。 - 大事务拆分:长事务锁表、引发死锁、主从延迟。
in语句元素数量不要过多,建议小于 500。- 分页深分页(limit 100000,10)优化:用主键偏移方案。
4. ORM 层(MyBatis/MyBatis-Plus)
- SQL 写在 XML / 注解中,禁止硬拼 SQL(防注入)。
- 参数使用
#{},禁止${}(SQL 注入风险)。
五、工程结构 & 分层规范(项目架构)
标准分层(新手必须遵守,不乱分层):
- Controller 层:接收请求、参数校验、路由、返回结果
- 不写业务逻辑,不直接操作数据库
- Service 层:核心业务逻辑、事务控制
- 事务注解
@Transactional加在 Service 方法上
- 事务注解
- Mapper/DAO 层:仅做数据库 CRUD,无业务逻辑
- Entity/DTO/VO:数据载体,分层隔离
包结构统一:按功能模块划分,不要按技术类型划分。
- 错误:
controller/ service/ mapper所有类堆一起 - 正确:
user/ order/ goods每个模块下分 controller/service/mapper
六、安全规约(线上必守)
- 防 SQL 注入:不用
${},参数预编译。 - 防 XSS 跨站脚本:前端 + 后端统一转义特殊字符。
- 接口参数校验:所有入参非空、长度、格式校验(用 Hibernate Validator)。
- 敏感数据(手机号、身份证、密码)脱敏后再返回前端。
- 密码严禁明文存储,必须加盐哈希加密(BCrypt/SHA256)。
七、性能规约(新手进阶)
- 循环里不要创建对象,对象外提。
- 避免频繁 IO、数据库查询、远程调用。
- 热点数据用 Redis 缓存,减少 DB 压力。
- 异步处理:非核心流程(消息、通知、日志)用异步 / 消息队列,不阻塞主流程。
- 线程:禁止手动创建
new Thread(),统一使用线程池。
二、新手程序员重点注意问题(落地避坑清单)
1. 心态 & 编码习惯(第一位)
- 先想再写,不要边写边改简单功能也先梳理流程、入参、出参、异常场景。
- 写完代码自测正常场景、空参数、极端边界值、异常场景都测一遍,再提交。
- 不要复制粘贴代码不检查复制后一定要改变量名、条件、注释,这是 BUG 重灾区。
- 勤写注释复杂逻辑、特殊业务、算法必须加注释;注释说明 “为什么”,不是 “做什么”。
2. 每天必检查的代码点(CR 高频问题)
- 所有入参是否做了非空 / 合法性校验?
- 集合、字符串有没有用正确工具类判空?
- 有没有魔法值、硬编码?
- 字符串拼接、循环有没有用对
StringBuilder? - 异常有没有捕获、打日志,有没有吞异常?
- SQL 是不是
select *、有没有深分页、左模糊? - 资源(流、连接)有没有正常关闭?
3. 绝对不能犯的低级错误
- 空指针 NPE:新手第一大 BUG,对象使用前必判空。
- 集合遍历时增删元素,触发
ConcurrentModificationException。 - 用
==比较字符串、包装类。 - 金额用
double/float,精度丢失。 - 线上代码留
System.out、e.printStackTrace()。 - 大事务、长事务导致锁表。
- 接口不做参数校验,被非法参数攻击。
4. 版本控制 Git 规范(工作必备)
- 提交注释清晰:
[模块] 功能/修复:xxx - 禁止直接往
main/master分支提交代码,走分支 + 合并。 - 拉代码先
pull再写代码,避免大量冲突。
5. 学习建议(新手成长路线)
- 先吃透基础规约,把格式、命名、判空、集合、异常练成本能。
- 写代码分层思维:分清 Controller/Service/Mapper 职责。
- 遇到报错先看日志,学会根据堆栈定位问题。
- 不要一味堆新语法,稳定、可读、可维护优先。
- 每次改完代码,复盘:为什么出问题?规范里哪条对应?
总结(极简背诵版)
新手抓4 个核心就能避开 90% 问题:
- 命名格式统一,拒绝拼音、魔法值、混搭风格。
- 判空到位:对象、字符串、集合全套工具类判空,防 NPE。
- 异常日志规范:不吞异常、不用原生输出、分级打日志。
- SQL 保守写法:不 select*、慎用模糊查询、合理建索引、逻辑删除。
照着手册规范写代码,不仅减少 BUG,面试、代码评审也会非常加分。
