阿里巴巴Java开发手册(1.3.0)

发布于:2025-07-04 ⋅ 阅读:(17) ⋅ 点赞:(0)

《阿里巴巴Java开发手册(终极版)》免费在线阅读_藏经阁-阿里云开发者社区

前言

《阿里巴巴Java开发手册》是阿里巴巴集团技术团队的经验总结,涵盖编程规约、异常日志、单元测试等六个维度。规约分为强制、推荐、参考三类,通过“说明”“正例”“反例”辅助理解。手册旨在“码出高效,码出质量”,通过统一规范提升协作效率,减少重复问题。

目录

  • 一、编程规约
  • 二、异常日志
  • 三、单元测试
  • 四、安全规约
  • 五、MySQL数据库
  • 六、工程结构

一、编程规约

(一)命名风格

  1. 强制:命名不能以下划线或美元符号开头/结尾。
    • 反例:_namename$
  1. 强制:禁止拼音与英文混合或直接使用中文命名。
    • 正例:alibabataobao
    • 反例:DaZhePromotionint 某变量 = 3
  1. 强制:类名使用UpperCamelCase风格,DO/BO等例外。
    • 正例:UserDOXmlService
  1. 强制:方法名、参数名等使用lowerCamelCase风格。
    • 正例:getHttpMessage()inputUserId
  1. 强制:常量全大写,单词间用下划线分隔。
    • 正例:MAX_STOCK_COUNT
  1. 强制:抽象类以AbstractBase开头,异常类以Exception结尾,测试类以Test结尾。
  2. 强制:数组定义使用String[] args,而非String args[]
  3. 强制:POJO类中布尔变量不加is,避免序列化错误。
  4. 强制:包名统一小写,类名可使用复数形式。
  5. 强制:杜绝不规范缩写,如AbsClass(应为AbstractClass)。

(二)常量定义

  1. 强制:禁止魔法值直接出现在代码中。
    • 反例:cache.put("Id#taobao_" + tradeId, value);
  1. 强制:long类型初始值使用大写L
  2. 推荐:按功能归类常量,避免全量维护在一个类中。
  3. 推荐:常量复用层次分为跨应用、应用内等五层。
  4. 推荐:若变量值范围固定且有延伸属性,定义为枚举类。

(三)代码格式

  1. 强制:大括号使用规范,非空代码块左大括号后换行,右大括号前换行。
  2. 强制:括号与字符间无空格,保留字与括号间加空格。
  3. 强制:运算符左右加空格,使用4个空格缩进,禁止使用Tab。
  4. 强制:注释的双斜线与内容间有一个空格,单行字符数不超过120个。

(四)OOP规约

  1. 强制:通过类名访问静态成员,覆写方法必须加@Override注解。
  2. 强制:可变参数需放置在参数列表最后,避免使用Object
  3. 强制:外部接口不允许修改方法签名,过时接口加@Deprecated注解。
  4. 强制:使用常量或确定对象调用equals方法,避免NPE。
  5. 强制:POJO类属性使用包装数据类型,序列化类新增属性时谨慎修改serialVersionUID

(五)集合处理

  1. 强制:重写equals必须重写hashCodeSetMap键对象需遵守此规则。
  2. 强制ArrayListsubList结果不可强转,避免ConcurrentModificationException
  3. 强制:使用toArray(T[] array)转换集合,避免无参方法的类型转换异常。
  4. 强制Arrays.asList()转换的集合不可修改,否则抛出UnsupportedOperationException

(六)并发处理

  1. 强制:单例对象需保证线程安全,创建线程时指定有意义的名称。
  2. 强制:线程资源通过线程池提供,禁止显式创建线程,避免使用Executors创建线程池。
  3. 强制SimpleDateFormat非线程安全,需加锁或使用ThreadLocal
  4. 强制:多资源加锁需保持一致顺序,避免死锁;并发修改记录时需加锁或使用乐观锁。

(七)控制语句

  1. 强制switch块需包含default语句并放在最后,每个case需明确终止方式。
  2. 强制if/else等语句必须使用大括号,避免单行编码。
  3. 推荐:条件判断中复杂逻辑赋值给布尔变量,提升可读性。
  4. 推荐:循环体内避免定义对象、获取数据库连接等操作,移至循环体外。

(八)注释规约

  1. 强制:类、属性、方法注释使用Javadoc规范,抽象方法需说明功能。
  2. 强制:所有类添加创建者和日期,枚举字段添加注释。
  3. 推荐:中文注释需准确清晰,代码修改时同步更新注释。
  4. 参考:谨慎注释代码,无用代码直接删除,特殊标记需注明处理人及时间。

(九)其它

  1. 强制:正则表达式使用预编译功能,velocity调用POJO属性直接使用属性名。
  2. 强制:后台输出给页面的变量加$!{var},避免null值直接显示。
  3. 推荐:视图模板不加入复杂逻辑,数据结构初始化指定大小,及时清理无效代码。

二、异常日志

(一)异常处理

  1. 强制:RuntimeException可通过预检查规避,不通过catch处理,如NullPointerException
  2. 强制:异常不用于流程控制,大段代码需区分稳定与非稳定代码进行catch。
  3. 强制:catch异常后必须处理,finally块关闭资源,禁止在finally中使用return。
  4. 推荐:方法返回值可为null,但需注释说明;使用Optional类防止NPE。

(二)日志规约

  1. 强制:应用依赖SLF4J日志框架,而非直接使用Log4j/Logback API。
  2. 强制:日志文件保存至少15天,扩展日志命名需包含应用名、类型和描述。
  3. 强制:日志输出使用条件判断或占位符,避免无意义的字符串拼接。
  4. 推荐:生产环境谨慎输出日志,error级别仅记录系统错误,warn级别记录参数错误。

三、单元测试

  1. 强制:单元测试遵守AIR原则(自动化、独立性、可重复),全自动执行,不依赖交互式操作。
  2. 强制:测试用例相互独立,不依赖执行顺序,避免对外部环境的依赖。
  3. 强制:测试粒度为方法级别,核心模块语句覆盖率和分支覆盖率达100%。
  4. 推荐:遵循BCDE原则(边界、正确、设计、错误),数据库相关测试需准备数据并设定回滚机制。

四、安全规约

  1. 强制:用户个人页面或功能需进行权限控制,敏感数据展示需脱敏。
  2. 强制:用户输入参数严格校验,防止SQL注入、XSS攻击等,禁止字符串拼接SQL。
  3. 强制:表单提交执行CSRF安全过滤,平台资源操作实现防重放限制。
  4. 推荐:用户生成内容场景实现防刷和违禁词过滤策略。

五、MySQL数据库

(一)建表规约

  1. 强制:布尔字段使用is_xxx命名,数据类型为unsigned tinyint,表名、字段名使用小写字母。
  2. 强制:表名不使用复数名词,禁用保留字,主键索引名pk_字段名,唯一索引名uk_字段名
  3. 强制:小数类型使用decimal,禁止float/double,表必备idgmt_creategmt_modified字段。
  4. 推荐:单表行数超过500万或容量超过2GB时分库分表,字段适当冗余提升查询性能。

(二)索引规约

  1. 强制:业务唯一特性字段建唯一索引,多表join字段数据类型一致且有索引。
  2. 强制varchar字段建索引时指定长度,页面搜索禁止左模糊或全模糊。
  3. 推荐:利用覆盖索引避免回表,组合索引区分度高的字段放最左,避免隐式转换导致索引失效。

(三)SQL语句

  1. 强制:使用count(*)而非count(列名)ISNULL()判断NULL值,避免sum()的NPE问题。
  2. 强制:禁止使用外键与级联,数据订正前先查询,避免误操作。
  3. 推荐in操作集合元素控制在1000个以内,TRUNCATE TABLE需谨慎使用。

(四)ORM映射

  1. 强制:查询不使用*,明确字段列表,POJO布尔属性与数据库字段通过resultMap映射。
  2. 强制:SQL参数使用#param#而非${},避免SQL注入,禁止直接返回HashMap/Hashtable
  3. 推荐:更新记录时同步更新gmt_modified字段,避免大而全的更新接口。

六、工程结构

(一)应用分层

  1. 推荐:工程分为开放接口层、Web层、Service层、Manager层、DAO层等,上层依赖下层。
  2. 参考:分层异常处理需记录日志,Web层跳转友好错误页面,开放接口返回错误码。
  3. 参考:领域模型包括DO、DTO、BO、AO、VO等,查询参数封装为对象。

(二)二方库依赖

  1. 强制:GAV格式遵循com.{公司/BU}.业务线.[子业务线]:产品线名-模块名:版本号
  2. 强制:版本号按主版本号.次版本号.修订号命名,线上应用不依赖SNAPSHOT版本。
  3. 推荐:依赖声明放<dependencies>,版本仲裁放<dependencyManagement>,二方库精简配置项。

(三)服务器

  1. 推荐:高并发服务器调小TCP协议的time_wait超时时间,调大最大文件句柄数。
  2. 推荐:JVM设置-XX:+HeapDumpOnOutOfMemoryErrorXmsXmx设置相同大小。