《阿里巴巴Java开发手册(终极版)》免费在线阅读_藏经阁-阿里云开发者社区
前言
《阿里巴巴Java开发手册》是阿里巴巴集团技术团队的经验总结,涵盖编程规约、异常日志、单元测试等六个维度。规约分为强制、推荐、参考三类,通过“说明”“正例”“反例”辅助理解。手册旨在“码出高效,码出质量”,通过统一规范提升协作效率,减少重复问题。
目录
- 一、编程规约
- 二、异常日志
- 三、单元测试
- 四、安全规约
- 五、MySQL数据库
- 六、工程结构
一、编程规约
(一)命名风格
- 强制:命名不能以下划线或美元符号开头/结尾。
-
- 反例:
_name
、name$
- 反例:
- 强制:禁止拼音与英文混合或直接使用中文命名。
-
- 正例:
alibaba
、taobao
- 反例:
DaZhePromotion
、int 某变量 = 3
- 正例:
- 强制:类名使用UpperCamelCase风格,DO/BO等例外。
-
- 正例:
UserDO
、XmlService
- 正例:
- 强制:方法名、参数名等使用lowerCamelCase风格。
-
- 正例:
getHttpMessage()
、inputUserId
- 正例:
- 强制:常量全大写,单词间用下划线分隔。
-
- 正例:
MAX_STOCK_COUNT
- 正例:
- 强制:抽象类以
Abstract
或Base
开头,异常类以Exception
结尾,测试类以Test
结尾。 - 强制:数组定义使用
String[] args
,而非String args[]
。 - 强制:POJO类中布尔变量不加
is
,避免序列化错误。 - 强制:包名统一小写,类名可使用复数形式。
- 强制:杜绝不规范缩写,如
AbsClass
(应为AbstractClass
)。
(二)常量定义
- 强制:禁止魔法值直接出现在代码中。
-
- 反例:
cache.put("Id#taobao_" + tradeId, value);
- 反例:
- 强制:long类型初始值使用大写
L
。 - 推荐:按功能归类常量,避免全量维护在一个类中。
- 推荐:常量复用层次分为跨应用、应用内等五层。
- 推荐:若变量值范围固定且有延伸属性,定义为枚举类。
(三)代码格式
- 强制:大括号使用规范,非空代码块左大括号后换行,右大括号前换行。
- 强制:括号与字符间无空格,保留字与括号间加空格。
- 强制:运算符左右加空格,使用4个空格缩进,禁止使用Tab。
- 强制:注释的双斜线与内容间有一个空格,单行字符数不超过120个。
(四)OOP规约
- 强制:通过类名访问静态成员,覆写方法必须加
@Override
注解。 - 强制:可变参数需放置在参数列表最后,避免使用
Object
。 - 强制:外部接口不允许修改方法签名,过时接口加
@Deprecated
注解。 - 强制:使用常量或确定对象调用
equals
方法,避免NPE。 - 强制:POJO类属性使用包装数据类型,序列化类新增属性时谨慎修改
serialVersionUID
。
(五)集合处理
- 强制:重写
equals
必须重写hashCode
,Set
和Map
键对象需遵守此规则。 - 强制:
ArrayList
的subList
结果不可强转,避免ConcurrentModificationException
。 - 强制:使用
toArray(T[] array)
转换集合,避免无参方法的类型转换异常。 - 强制:
Arrays.asList()
转换的集合不可修改,否则抛出UnsupportedOperationException
。
(六)并发处理
- 强制:单例对象需保证线程安全,创建线程时指定有意义的名称。
- 强制:线程资源通过线程池提供,禁止显式创建线程,避免使用
Executors
创建线程池。 - 强制:
SimpleDateFormat
非线程安全,需加锁或使用ThreadLocal
。 - 强制:多资源加锁需保持一致顺序,避免死锁;并发修改记录时需加锁或使用乐观锁。
(七)控制语句
- 强制:
switch
块需包含default
语句并放在最后,每个case
需明确终止方式。 - 强制:
if/else
等语句必须使用大括号,避免单行编码。 - 推荐:条件判断中复杂逻辑赋值给布尔变量,提升可读性。
- 推荐:循环体内避免定义对象、获取数据库连接等操作,移至循环体外。
(八)注释规约
- 强制:类、属性、方法注释使用Javadoc规范,抽象方法需说明功能。
- 强制:所有类添加创建者和日期,枚举字段添加注释。
- 推荐:中文注释需准确清晰,代码修改时同步更新注释。
- 参考:谨慎注释代码,无用代码直接删除,特殊标记需注明处理人及时间。
(九)其它
- 强制:正则表达式使用预编译功能,
velocity
调用POJO属性直接使用属性名。 - 强制:后台输出给页面的变量加
$!{var}
,避免null
值直接显示。 - 推荐:视图模板不加入复杂逻辑,数据结构初始化指定大小,及时清理无效代码。
二、异常日志
(一)异常处理
- 强制:RuntimeException可通过预检查规避,不通过catch处理,如
NullPointerException
。 - 强制:异常不用于流程控制,大段代码需区分稳定与非稳定代码进行catch。
- 强制:catch异常后必须处理,finally块关闭资源,禁止在finally中使用return。
- 推荐:方法返回值可为
null
,但需注释说明;使用Optional
类防止NPE。
(二)日志规约
- 强制:应用依赖SLF4J日志框架,而非直接使用Log4j/Logback API。
- 强制:日志文件保存至少15天,扩展日志命名需包含应用名、类型和描述。
- 强制:日志输出使用条件判断或占位符,避免无意义的字符串拼接。
- 推荐:生产环境谨慎输出日志,error级别仅记录系统错误,warn级别记录参数错误。
三、单元测试
- 强制:单元测试遵守AIR原则(自动化、独立性、可重复),全自动执行,不依赖交互式操作。
- 强制:测试用例相互独立,不依赖执行顺序,避免对外部环境的依赖。
- 强制:测试粒度为方法级别,核心模块语句覆盖率和分支覆盖率达100%。
- 推荐:遵循BCDE原则(边界、正确、设计、错误),数据库相关测试需准备数据并设定回滚机制。
四、安全规约
- 强制:用户个人页面或功能需进行权限控制,敏感数据展示需脱敏。
- 强制:用户输入参数严格校验,防止SQL注入、XSS攻击等,禁止字符串拼接SQL。
- 强制:表单提交执行CSRF安全过滤,平台资源操作实现防重放限制。
- 推荐:用户生成内容场景实现防刷和违禁词过滤策略。
五、MySQL数据库
(一)建表规约
- 强制:布尔字段使用
is_xxx
命名,数据类型为unsigned tinyint
,表名、字段名使用小写字母。 - 强制:表名不使用复数名词,禁用保留字,主键索引名
pk_字段名
,唯一索引名uk_字段名
。 - 强制:小数类型使用
decimal
,禁止float/double
,表必备id
、gmt_create
、gmt_modified
字段。 - 推荐:单表行数超过500万或容量超过2GB时分库分表,字段适当冗余提升查询性能。
(二)索引规约
- 强制:业务唯一特性字段建唯一索引,多表join字段数据类型一致且有索引。
- 强制:
varchar
字段建索引时指定长度,页面搜索禁止左模糊或全模糊。 - 推荐:利用覆盖索引避免回表,组合索引区分度高的字段放最左,避免隐式转换导致索引失效。
(三)SQL语句
- 强制:使用
count(*)
而非count(列名)
,ISNULL()
判断NULL值,避免sum()
的NPE问题。 - 强制:禁止使用外键与级联,数据订正前先查询,避免误操作。
- 推荐:
in
操作集合元素控制在1000个以内,TRUNCATE TABLE
需谨慎使用。
(四)ORM映射
- 强制:查询不使用
*
,明确字段列表,POJO布尔属性与数据库字段通过resultMap
映射。 - 强制:SQL参数使用
#param#
而非${}
,避免SQL注入,禁止直接返回HashMap/Hashtable
。 - 推荐:更新记录时同步更新
gmt_modified
字段,避免大而全的更新接口。
六、工程结构
(一)应用分层
- 推荐:工程分为开放接口层、Web层、Service层、Manager层、DAO层等,上层依赖下层。
- 参考:分层异常处理需记录日志,Web层跳转友好错误页面,开放接口返回错误码。
- 参考:领域模型包括DO、DTO、BO、AO、VO等,查询参数封装为对象。
(二)二方库依赖
- 强制:GAV格式遵循
com.{公司/BU}.业务线.[子业务线]:产品线名-模块名:版本号
。 - 强制:版本号按主版本号.次版本号.修订号命名,线上应用不依赖SNAPSHOT版本。
- 推荐:依赖声明放
<dependencies>
,版本仲裁放<dependencyManagement>
,二方库精简配置项。
(三)服务器
- 推荐:高并发服务器调小TCP协议的time_wait超时时间,调大最大文件句柄数。
- 推荐:JVM设置
-XX:+HeapDumpOnOutOfMemoryError
,Xms
和Xmx
设置相同大小。