阿里Java开发规范








    前言
    阿里巴巴 Java 开发手册阿里巴巴集团技术团队集体智慧结晶验总
    结历次规模线实战检验断完善系统化整理成册回馈广
    开发者现代软件行业高速发展开发者综合素质求越越高仅编
    程知识点维度知识点会影响软件终交付质量:数库表结
    构索引设计缺陷带软件架构缺陷性风险工程结构混乱导致续维
    护艰难没鉴权漏洞代码易黑客攻击等等手册 Java 开发者中心视
    角划分编程规约异常日志单元测试安全规约MySQL 数库工程结构设
    计规约七维度根容特征细分成干二级子目录根约束力强弱障
    敏感性规约次分强制推荐参考三类规约条目延伸信息中说
    明规约做适扩展解释正例提倡什样编码实现方式反例
    说明需提防雷区真实错误案例
    手册旨码出高效码出质量现代软件架构复杂性需协开发完成
    高效协呢?规矩成方圆规范难协制订交通法规表面
    限制行车权实际保障公众身安全试想果没限速没红绿灯
    谁敢路行驶软件说适规范标准绝消灭代码容创造性优
    雅性限制度性化种普遍认统方式起做事提升协作效率
    降低沟通成代码字里行间流淌软件系统血液质量提升少踩
    坑杜绝踩重复坑切实提升系统稳定性码出质量
    考虑零距离众开发学进行互动决定未线维护手册容
    140 PDF 版详版新增设计规约章节增加干条目
    已 2017 杭州云栖会发布阿里巴巴 Java 开发规约插件(点载)阿里
    云效(站式企业协研发云)集成代码规约扫描引擎码出高效——
    阿里巴巴 Java 开发手册详解出版敬请关注 目录
    前言
    编程规约 1
    () 命名风格 1
    (二) 常量定义 3
    (三) 代码格式 4
    (四) OOP 规约 6
    (五) 集合处理 9
    (六) 发处理 12
    (七) 控制语句 14
    (八) 注释规约 16
    (九) 18
    二异常日志 19
    () 异常处理 19
    (二) 日志规约 20
    三单元测试 22
    四安全规约 24
    五MySQL 数库 25
    () 建表规约 25
    (二) 索引规约 26
    (三) SQL 语句 28
    (四) ORM 映射 29
    六工程结构 31
    () 应分层 31
    (二) 二方库赖 32
    (三) 服务器 33
    七设计规约 35
    附 1:版历史 37
    附 2:专名词解释 38


    (注:浏览时请 PDF 左侧导航栏)

    阿里巴巴 Java 开发手册
    138
    Java 开发手册
    版号 制定团队 更新日期 备注
    140 阿里巴巴集团技术团队 2018520 增加设计规约(详版)

    编程规约
    () 命名风格
    1 强制代码中命名均划线美元符号开始划线美元符号结束
    反例:_name __name name name_ name name__
    2 强制代码中命名严禁拼音英文混合方式更允许直接中文方式
    说明:正确英文拼写语法阅读者易理解避免歧义注意纯拼音命名方式
    避免采
    正例:alibaba taobao youku hangzhou 等国际通名称视英文
    反例:DaZhePromotion [折] getPingfenByName() [评分] int 某变量 3
    3 强制类名 UpperCamelCase 风格情形例外:DO BO DTO VO AO
    PO UID 等
    正例:MarcoPolo UserDO XmlService TcpUdpDeal TaPromotion
    反例:macroPolo UserDo XMLService TCPUDPDeal TAPromotion
    4 强制方法名参数名成员变量局部变量统 lowerCamelCase 风格必须遵
    驼峰形式
    正例: localValue getHttpMessage() inputUserId
    5 强制常量命名全部写单词间划线隔开力求语义表达完整清楚嫌名字长
    正例:MAX_STOCK_COUNT
    反例:MAX_COUNT
    6 强制抽象类命名 Abstract Base 开头异常类命名 Exception 结尾测试类
    命名测试类名称开始 Test 结尾
    7 强制类型中括号紧挨相连表示数组
    正例:定义整形数组 int[] arrayDemo
    反例: main 参数中 String args[]定义
    8 强制POJO 类中布尔类型变量加 is 前缀否部分框架解析会引起序列化错误
    反例:定义基数类型 Boolean isDeleted 属性方法 isDeleted()RPC阿里巴巴 Java 开发手册
    238
    框架反解析时候误应属性名称 deleted导致属性获取进抛
    出异常
    9 强制包名统写点分隔符间仅然语义英语单词包名统
    单数形式类名果复数含义类名复数形式
    正例:应工具类包名 comalibabaaiutil类名 MessageUtils(规参考 spring
    框架结构)
    10 强制杜绝完全规范缩写避免文知义
    反例:AbstractClass缩写命名成 AbsClasscondition缩写命名成 condi类
    意缩写严重降低代码阅读性
    11 推荐达代码解释目标定义编程元素命名时量完整单词
    组合表达意
    正例: JDK 中表达原子更新类名:AtomicReferenceFieldUpdater
    反例:变量 int a 意命名方式
    12 推荐果模块接口类方法设计模式命名时需体现出具体模式
    说明:设计模式体现名字中利阅读者快速理解架构设计理念
    正例:public class OrderFactory
    public class LoginProxy
    public class ResourceObserver
    13 推荐接口类中方法属性加修饰符号(public 加)保持代码简洁
    性加效 Javadoc 注释量接口里定义变量果定定义变量肯定
    接口方法相关整应基础常量
    正例:接口方法签名 void commit()
    接口基础常量 String COMPANY alibaba
    反例:接口方法定义 public abstract void f()
    说明:JDK8 中接口允许默认实现 default 方法实现类价值默
    认实现
    14 接口实现类命名两套规:
    1)强制 Service DAO 类基 SOA 理念暴露出服务定接口部
    实现类 Impl 缀接口区
    正例:CacheServiceImpl 实现 CacheService 接口
    2) 推荐 果形容力接口名称取应形容词接口名(通常–able 形式)
    正例:AbstractTranslator 实现 Translatable 接口 阿里巴巴 Java 开发手册
    338
    15 参考枚举类名建议带 Enum 缀枚举成员名称需全写单词间划线隔开
    说明:枚举实特殊类域成员均常量构造方法默认强制私
    正例:枚举名字 ProcessStatusEnum 成员名称:SUCCESS UNKNOWN_REASON
    16 参考层命名规约:
    A) ServiceDAO 层方法命名规约
    1) 获取单象方法 get 做前缀
    2) 获取象方法 list 做前缀复数形式结尾:listObjects
    3) 获取统计值方法 count 做前缀
    4) 插入方法 saveinsert 做前缀
    5) 删方法 removedelete 做前缀
    6) 修改方法 update 做前缀
    B) 领域模型命名规约
    1) 数象:xxxDOxxx 数表名
    2) 数传输象:xxxDTOxxx 业务领域相关名称
    3) 展示象:xxxVOxxx 般网页名称
    4) POJO DODTOBOVO 统称禁止命名成 xxxPOJO

    (二) 常量定义
    1 强制允许魔法值(未预先定义常量)直接出现代码中
    反例:String key Id#taobao_ + tradeId
    cacheput(key value)
    2 强制 long 者 Long 赋值时数值写 L写 l写容易数字
    1 混淆造成误解
    说明:Long a 2l 写数字 21 Long 型 2
    3 推荐常量类维护常量常量功进行类分开维护
    说明:全常量类杂乱章查找功定位修改常量利理解维护
    正例:缓存相关常量放类 CacheConsts 系统配置相关常量放类 ConfigConsts
    4 推荐常量复层次五层:跨应享常量应享常量子工程享常量包
    享常量类享常量
    1) 跨应享常量:放置二方库中通常 clientjar 中 constant 目录
    2) 应享常量:放置方库中通常子模块中 constant 目录
    反例:易懂变量统定义成应享常量两位攻城师两类中分定义表示
    变量:
    类 A 中:public static final String YES yes 阿里巴巴 Java 开发手册
    438
    类 B 中:public static final String YES y
    AYESequals(BYES)预期 true实际返回 false导致线问题
    3) 子工程部享常量:前子工程 constant 目录
    4) 包享常量:前包单独 constant 目录
    5) 类享常量:直接类部 private static final 定义
    5 推荐果变量值仅固定范围变化 enum 类型定义
    说明:果存名称外延伸属性应 enum 类型面正例中数字延伸信息表
    示年中第季节
    正例:
    public enum SeasonEnum {
    SPRING(1) SUMMER(2) AUTUMN(3) WINTER(4)
    private int seq
    SeasonEnum(int seq){
    thisseq seq
    }
    }

    (三) 代码格式
    1 强制括号约定果括号空简洁写成{}需换行果
    非空代码块:
    1) 左括号前换行
    2) 左括号换行
    3) 右括号前换行
    4) 右括号 else 等代码换行表示终止右括号必须换行
    2 强制左括号字符间出现空格样右括号字符间出现空格左
    括号前需空格详见第 5 条方正例提示
    反例:if (空格 a b 空格)
    3 强制ifforwhileswitchdo 等保留字括号间必须加空格
    4 强制二目三目运算符左右两边需加空格
    说明:运算符包括赋值运算符逻辑运算符&&加减符号等
    5 强制采 4 空格缩进禁止 tab 字符
    说明:果 tab 缩进必须设置 1 tab 4 空格IDEA 设置 tab 4 空格时
    请勿勾选 Use tab character eclipse 中必须勾选 insert spaces for tabs

    阿里巴巴 Java 开发手册
    538
    正例: (涉 15 点)
    public static void main(String[] args) {

    缩进 4 空格
    String say hello
    运算符左右必须空格
    int flag 0
    关键词 if 括号间必须空格括号 f 左括号0 右括号需空格
    if (flag 0) {
    Systemoutprintln(say)
    }

    左括号前加空格换行左括号换行
    if (flag 1) {
    Systemoutprintln(world)
    右括号前换行右括号 else换行
    } else {
    Systemoutprintln(ok)
    右括号直接结束必须换行
    }
    }
    6 强制注释双斜线注释容间仅空格
    正例:
    示例注释请注意双斜线空格
    String ygb new String()
    7 强制单行字符数限制超 120 超出需换行换行时遵循原:
    1) 第二行相第行缩进 4 空格第三行开始继续缩进参考示例
    2) 运算符文起换行
    3) 方法调点符号文起换行
    4) 方法调中参数需换行时逗号进行
    5) 括号前换行见反例
    正例:
    StringBuffer sb new StringBuffer()
    超 120 字符情况换行缩进 4 空格点号方法名称起换行
    sbappend(zi)append(xin)
    append(huang)
    append(huang)
    append(huang)
    反例:
    StringBuffer sb new StringBuffer()
    超 120 字符情况括号前换行
    sbappend(zi)append(xin)append
    (huang)

    参数方法调超 120 字符逗号前换行
    method(args1 args2 args3
    argsX) 阿里巴巴 Java 开发手册
    638
    8 强制方法参数定义传入时参数逗号边必须加空格
    正例:例中实参 args1边必须空格
    method(args1 args2 args3)
    9 强制IDE text file encoding 设置 UTF8 IDE 中文件换行符 Unix 格式
    Windows 格式
    10 推荐单方法总行数超 80 行
    说明:包括方法签名结束右括号方法代码注释空行回车见字符总
    行数超 80 行
    正例:代码逻辑分清红花绿叶性性绿叶逻辑单独出成额外方法干代码
    更加清晰性逻辑抽取成性方法便复维护
    11 推荐没必增加干空格某行字符行应位置字符齐
    正例:
    int one 1
    long two 2L
    float three 3F
    StringBuffer sb new StringBuffer()
    说明:增加 sb 变量果需齐 abc 增加空格变量较
    情况非常累赘事情
    12 推荐逻辑语义业务代码间插入空行分隔开提升读性
    说明:情形没必插入空行进行隔开
    (四) OOP 规约
    1 强制避免通类象引访问类静态变量静态方法谓增加编译器解析成
    直接类名访问
    2 强制覆写方法必须加@Override 注解
    说明:getObject() get0bject()问题字母 O数字 0加@Override
    准确判断否覆盖成功外果抽象类中方法签名进行修改实现类会马编
    译报错
    3 强制相参数类型相业务含义 Java 变参数避免 Object
    说明:变参数必须放置参数列表(提倡学量变参数编程)
    正例:public List listUsers(String type Long ids) {}
    4 强制外部正调者二方库赖接口允许修改方法签名避免接口调方产生
    影响接口时必须加@Deprecated 注解清晰说明采新接口者新服务什
    5 强制时类方法
    说明:javanetURLDecoder 中方法 decode(String encodeStr) 方法已时应阿里巴巴 Java 开发手册
    738
    该双参数 decode(String source String encode)接口提供方然明确时接口
    义务时提供新接口作调方说义务考证时方法新实现什
    6 强制Object equals 方法容易抛空指针异常应常量确定值象调
    equals
    正例:testequals(object)
    反例:objectequals(test)
    说明:推荐 javautilObjects#equals(JDK7 引入工具类)
    7 强制相类型包装类象间值较全部 equals 方法较
    说明: Integer var 128 127 范围赋值Integer 象
    IntegerCachecache 产生会复已象区间 Integer 值直接进行
    判断区间外数会堆产生会复已象坑
    推荐 equals 方法进行判断
    8 关基数类型包装数类型标准:
    1) 强制 POJO 类属性必须包装数类型
    2) 强制RPC 方法返回值参数必须包装数类型
    3) 推荐局部变量基数类型
    说明:POJO 类属性没初值提醒者需时必须显式进行赋值
    NPE 问题者入库检查者保证
    正例:数库查询结果 null动拆箱基数类型接收 NPE 风险
    反例:显示成交总额涨跌情况正负 xx 基数类型调 RPC 服务调
    成功时返回默认值页面显示 0合理应该显示成中划线包装
    数类型 null 值够表示额外信息:远程调失败异常退出
    9 强制定义 DODTOVO 等 POJO 类时设定属性默认值
    反例:POJO 类 gmtCreate 默认值 new Date()属性数提取时没置入具
    体值更新字段时附带更新字段导致创建时间修改成前时间
    10 强制序列化类新增属性时请修改 serialVersionUID 字段避免反序列失败
    果完全兼容升级避免反序列化混乱请修改 serialVersionUID 值
    说明:注意 serialVersionUID 致会抛出序列化运行时异常
    11 强制构造方法里面禁止加入业务逻辑果初始化逻辑请放 init 方法中
    12 强制POJO 类必须写 toString 方法 IDE 中工具:source> generate toString
    时果继承 POJO 类注意前面加 supertoString
    说明:方法执行抛出异常时直接调 POJO toString()方法印属性值便排
    查问题 阿里巴巴 Java 开发手册
    838
    13 强制禁止 POJO 类中时存应属性 xxx isXxx() getXxx()方法
    说明:框架调属性 xxx 提取方法时确定方法定优先调
    14 推荐索引访问 String split 方法数组时需做分隔符
    容检查否会抛 IndexOutOfBoundsException 风险
    说明:
    String str abc
    String[] ary strsplit()
    预期 3结果 3
    Systemoutprintln(arylength)
    15 推荐类构造方法者名方法方法应该序放置起
    便阅读条规优先第 16 条规
    16 推荐 类方法定义序次:公方法保护方法 > 私方法 > gettersetter
    方法
    说明:公方法类调者维护者关心方法首屏展示保护方法然子类
    关心模板设计模式核心方法私方法外部般需特关心
    黑盒实现承载信息价值较低 Service DAO gettersetter 方法放类体

    17 推荐setter 方法中参数名称类成员变量名称致this成员名 参数名
    gettersetter 方法中增加业务逻辑增加排查问题难度
    反例:
    public Integer getData() {
    if (condition) {
    return thisdata + 100
    } else {
    return thisdata 100
    }
    }
    18 推荐循环体字符串连接方式 StringBuilder append 方法进行扩展
    说明:例中反编译出字节码文件显示次循环会 new 出 StringBuilder 象
    然进行 append 操作通 toString 方法返回 String 象造成存资源浪费
    反例:
    String str start
    for (int i 0 i < 100 i++) {
    str str + hello
    }
    19 推荐final 声明类成员变量方法变量列情况 final 关键字:
    1) 允许继承类:String 类
    2) 允许修改引域象
    3) 允许重写方法:POJO 类 setter 方法 阿里巴巴 Java 开发手册
    938
    4) 允许运行程中重新赋值局部变量
    5) 避免文重复变量 final 描述强制重新定义变量方便更
    进行重构
    20 推荐慎 Object clone 方法拷贝象
    说明:象 clone 方法默认浅拷贝想实现深拷贝需重写 clone 方法实现域象
    深度遍历式拷贝
    21 推荐类成员方法访问控制严:
    1) 果允许外部直接通 new 创建象构造方法必须 private
    2) 工具类允许 public default 构造方法
    3) 类非 static 成员变量子类享必须 protected
    4) 类非 static 成员变量仅类必须 private
    5) 类 static 成员变量果仅类必须 private
    6) static 成员变量考虑否 final
    7) 类成员方法供类部调必须 private
    8) 类成员方法继承类公开限制 protected
    说明:类方法参数变量严控访问范围宽泛访问范围利模块解耦
    思考:果 private 方法想删删 public service 成员方法
    成员变量删手心点汗?变量孩量视线变量作
    域太限制处跑会担心

    (五) 集合处理
    1 强制关 hashCode equals 处理遵循规:
    1) 重写 equals必须重写 hashCode
    2) Set 存储重复象 hashCode equals 进行判断 Set 存储
    象必须重写两方法
    3) 果定义象作 Map 键必须重写 hashCode equals
    说明:String 重写 hashCode equals 方法非常愉快 String 象
    作 key
    2 强制 ArrayListsubList结果强转成ArrayList否会抛出 ClassCastException
    异常 javautilRandomAccessSubList cannot be cast to javautilArrayList
    说明:subList 返回 ArrayList 部类 SubList ArrayList ArrayList
    视图 SubList 子列表操作终会反映原列表
    3 强制 subList 场景中高度注意原集合元素增加删均会导致子列表遍历
    增加删产生 ConcurrentModificationException 异常 阿里巴巴 Java 开发手册
    1038
    4 强制集合转数组方法必须集合 toArray(T[] array)传入类型完全
    样数组 listsize()
    说明: toArray 带参方法入参分配数组空间够时toArray 方法部重新分配
    存空间返回新数组址果数组元素数实际需标[ listsize() ]
    数组元素置 null数组元素保持原值方法入参数组定义集
    合元素数致
    正例:
    List list new ArrayList(2)
    listadd(guan)
    listadd(bao)
    String[] array new String[listsize()]
    array listtoArray(array)
    反例:直接 toArray 参方法存问题方法返回值 Object[]类强转
    类型数组出现 ClassCastException 错误
    5 强制工具类 ArraysasList()数组转换成集合时修改集合相关方
    法 addremoveclear 方法会抛出 UnsupportedOperationException 异常
    说明:asList 返回象 Arrays 部类没实现集合修改方法ArraysasList
    体现适配器模式转换接口台数数组
    String[] str new String[] { you wu }
    List list ArraysasList(str)
    第种情况:listadd(yangguanbao) 运行时异常
    第二种情况:str[0] gujin listget(0)会修改
    6 强制泛型通配符< extends T>接收返回数写法泛型集合 add 方
    法< super T> get 方法作接口调赋值时易出错
    说明:扩展说 PECS(Producer Extends Consumer Super)原:第频繁外读取
    容适合< extends T>第二常里插入适合< super T>
    7 强制 foreach 循环里进行元素 removeadd 操作remove 元素请 Iterator
    方式果发操作需 Iterator 象加锁
    正例:
    List list new ArrayList<>()
    listadd(1)
    listadd(2)
    Iterator iterator listiterator()
    while (iteratorhasNext()) {
    String item iteratornext()
    if (删元素条件) {
    iteratorremove()
    }
    }
    阿里巴巴 Java 开发手册
    1138
    反例:
    for (String item list) {
    if (1equals(item)) {
    listremove(item)
    }
    }
    说明:代码执行结果肯定会出家意料试1换成2会样
    结果?
    8 强制 JDK7 版Comparator 实现类满足三条件然 Arrayssort
    Collectionssort 会报 IllegalArgumentException 异常
    说明:三条件
    1) xy 较结果 yx 较结果相反
    2) x>yy>z x>z
    3) xy xz 较结果 yz 较结果相
    反例:例中没处理相等情况实际中会出现异常:
    new Comparator() {
    @Override
    public int compare(Student o1 Student o2) {
    return o1getId() > o2getId() 1 1
    }
    }
    9 推荐集合泛型定义时 JDK7 diamond 语法全省略
    说明:菱形泛型 diamond直接<>指代前边已指定类型
    正例:
    <> diamond 方式
    HashMap userCache new HashMap<>(16)
    全省略方式
    ArrayList users new ArrayList(10)
    10 推荐集合初始化时指定集合初始值
    说明:HashMap HashMap(int initialCapacity) 初始化
    正例:initialCapacity (需存储元素数 负载子) + 1注意负载子( loader
    factor)默认 075果暂时法确定初始值请设置 16(默认值)
    反例:HashMap 需放置 1024 元素没设置容量初始着元素断增加容
    量 7 次迫扩resize 需重建 hash 表严重影响性
    11 推荐 entrySet 遍历 Map 类集合 KV keySet 方式进行遍历
    说明:keySet 实遍历 2 次次转 Iterator 象次 hashMap 中取出
    key 应 value entrySet 遍历次 key value 放 entry 中效
    率更高果 JDK8 Mapforeach 方法
    正例:values()返回 V 值集合 list 集合象keySet()返回 K 值集合
    Set 集合象entrySet()返回 KV 值组合集合 阿里巴巴 Java 开发手册
    1238
    12 推荐高度注意 Map 类集合 KV 存储 null 值情况表格:
    集合类 Key Value Super 说明
    Hashtable 允许 null 允许 null Dictionary 线程安全
    ConcurrentHashMap 允许 null 允许 null AbstractMap 锁分段技术(JDK8CAS)
    TreeMap 允许 null 允许 null AbstractMap 线程安全
    HashMap 允许 null 允许 null AbstractMap 线程安全
    反例: HashMap 干扰认 ConcurrentHashMap 置入 null 值事实
    存储 null 值时会抛出 NPE 异常
    13 参考合理利集合序性(sort)稳定性(order)避免集合序性(unsort)
    稳定性(unorder)带负面影响
    说明:序性指遍历结果某种较规次排列稳定性指集合次遍历元素次
    序定:ArrayList orderunsortHashMap unorderunsortTreeSet
    ordersort
    14 参考利 Set 元素唯特性快速集合进行重操作避免 List
    contains 方法进行遍历重操作

    (六) 发处理
    1 强制获取单例象需保证线程安全中方法保证线程安全
    说明:资源驱动类工具类单例工厂类需注意
    2 强制创建线程线程池时请指定意义线程名称方便出错时回溯
    正例:
    public class TimerTaskThread extends Thread {
    public TimerTaskThread() {
    supersetName(TimerTaskThread)

    }
    }
    3 强制线程资源必须通线程池提供允许应中行显式创建线程
    说明:线程池处减少创建销毁线程消耗时间系统资源开销解决
    资源足问题果线程池造成系统创建量类线程导致消耗完存
    者度切换问题 阿里巴巴 Java 开发手册
    1338
    4 强制线程池允许 Executors 创建通 ThreadPoolExecutor 方式样
    处理方式写学更加明确线程池运行规规避资源耗风险
    说明:Executors 返回线程池象弊端:
    1)FixedThreadPool SingleThreadPool
    允许请求队列长度 IntegerMAX_VALUE会堆积量请求导致 OOM
    2)CachedThreadPool ScheduledThreadPool
    允许创建线程数量 IntegerMAX_VALUE会创建量线程导致 OOM
    5 强制SimpleDateFormat 线程安全类般定义 static 变量果定义
    static必须加锁者 DateUtils 工具类
    正例:注意线程安全 DateUtils推荐处理:
    private static final ThreadLocal df new ThreadLocal() {
    @Override
    protected DateFormat initialValue() {
    return new SimpleDateFormat(yyyyMMdd)
    }
    }
    说明:果 JDK8 应 Instant 代 DateLocalDateTime 代 Calendar
    DateTimeFormatter 代 SimpleDateFormat官方出解释:simple beautiful strong
    immutable threadsafe
    6 强制高发时步调应该考量锁性损耗锁数结构锁
    锁区块锁整方法体象锁类锁
    说明:加锁代码块工作量避免锁代码块中调 RPC 方法
    7 强制资源数库表象时加锁时需保持致加锁序否会造
    成死锁
    说明:线程需表 ABC 次全部加锁进行更新操作线程二加锁序
    必须 ABC否出现死锁
    8 强制发修改记录时避免更新丢失需加锁应层加锁缓存加
    锁数库层乐观锁 version 作更新
    说明:果次访问突概率 20推荐乐观锁否悲观锁乐观锁重试次
    数 3 次
    9 强制线程行处理定时务时Timer 运行 TimeTask 时中没捕获
    抛出异常务便会动终止运行 ScheduledExecutorService 没问题
    10 推荐 CountDownLatch 进行异步转步操作线程退出前必须调 countDown
    方法线程执行代码注意 catch 异常确保 countDown 方法执行避免线程法执行
    await 方法直超时返回结果
    说明:注意子线程抛出异常堆栈线程 trycatch 阿里巴巴 Java 开发手册
    1438
    11 推荐避免 Random 实例线程然享该实例线程安全会竞争
    seed 导致性降
    说明:Random 实例包括 javautilRandom 实例者 Mathrandom()方式
    正例: JDK7 直接 API ThreadLocalRandom JDK7 前需编码保
    证线程持实例
    12 推荐发场景通双重检查锁(doublechecked locking)实现延迟初始化优
    化问题隐患(参考 The DoubleChecked Locking is Broken Declaration)推荐解
    决方案中较简单种(适 JDK5 版)目标属性声明 volatile 型
    反例:
    class LazyInitDemo {
    private Helper helper null
    public Helper getHelper() {
    if (helper null) synchronized(this) {
    if (helper null)
    helper new Helper()
    }
    return helper
    }
    other methods and fields
    }
    13 参考volatile 解决线程存见问题写读解决变量步问题
    果写样法解决线程安全问题果 count++操作类实现:
    AtomicInteger count new AtomicInteger() countaddAndGet(1) 果 JDK8推
    荐 LongAdder 象 AtomicLong 性更(减少乐观锁重试次数)
    14 参考 HashMap 容量够进行 resize 时高发出现死链导致 CPU 飙升
    开发程中数结构加锁规避风险
    15 参考ThreadLocal 法解决享象更新问题ThreadLocal 象建议 static
    修饰变量针线程操作享设置静态变量类实例享
    静态变量 说类第次时装载分配块存储空间类象(
    线程定义)操控变量

    (七) 控制语句
    1 强制 switch 块 case 通 breakreturn 等终止注释说明程
    序继续执行 case 止 switch 块必须包含 default 语句
    放空代码
    2 强制 ifelseforwhiledo 语句中必须括号行代码避免采
    单行编码方式:if (condition) statements 阿里巴巴 Java 开发手册
    1538
    3 强制高发场景中避免等判断作中断退出条件
    说明:果发控制没处理容易产生等值判断击穿情况区间
    判断条件代
    反例:判断剩余奖品数量等 0 时终止发放奖品发处理错误导致奖品数量瞬间变
    成负数样话活动法终止
    4 推荐表达异常分支时少 ifelse 方式种方式改写成:
    if (condition) {

    return obj
    }
    接着写 else 业务逻辑代码
    说明:果非 if()else if()else方式表达逻辑强制避免续代码维
    护困难请勿超 3 层
    正例:超 3 层 ifelse 逻辑判断代码卫语句策略模式状态模式等实现
    中卫语句示例:
    public void today() {
    if (isBusy()) {
    Systemoutprintln(change time)
    return
    }

    if (isFree()) {
    Systemoutprintln(go to travel)
    return
    }

    Systemoutprintln(stay at home to learn Alibaba Java Coding Guidelines)
    return
    }
    5 推荐常方法( getXxxisXxx)等外条件判断中执行复杂语句
    复杂逻辑判断结果赋值意义布尔变量名提高读性
    说明: if 语句逻辑相复杂阅读者需分析条件表达式终结果明确什
    样条件执行什样语句果阅读者分析逻辑表达式错误呢?
    正例:
    伪代码
    final boolean existed (fileopen(fileName w) null) && () || ()
    if (existed) {

    }
    反例:
    if ((fileopen(fileName w) null) && () || ()) {

    } 阿里巴巴 Java 开发手册
    1638
    6 推荐循环体中语句考量性操作量移循环体外处理定义象变量
    获取数库连接进行必 trycatch 操作( trycatch 否移循环体外)
    7 推荐避免采取反逻辑运算符
    说明:取反逻辑利快速理解取反逻辑写法必然存应正逻辑写法
    正例: if (x < 628) 表达 x 628
    反例: if ((x > 628)) 表达 x 628
    8 推荐接口入参保护种场景常见作批量操作接口
    9 参考列情形需进行参数校验:
    1) 调频次低方法
    2) 执行时间开销方法情形中参数校验时间忽略计果参
    数错误导致中间执行回退者错误偿失
    3) 需极高稳定性性方法
    4) 外提供开放接口 RPCAPIHTTP 接口
    5) 敏感权限入口
    10 参考列情形需进行参数校验:
    1) 极循环调方法方法说明里必须注明外部参数检查求
    2) 底层调频度较高方法毕竟纯净水滤道参数错误太底
    层会暴露问题般 DAO 层 Service 层应中部署台服务器中
    DAO 参数校验省略
    3) 声明成 private 会代码调方法果够确定调方法代码传入参
    数已做检查者肯定会问题时校验参数

    (八) 注释规约
    1 强制类类属性类方法注释必须 Javadoc 规范**容*格式
    xxx 方式
    说明: IDE 编辑窗口中Javadoc 方式会提示相关注释生成 Javadoc 正确输出相应注
    释 IDE 中工程调方法时进入方法悬浮提示方法参数返回值意义提高
    阅读效率
    2 强制抽象方法(包括接口中方法)必须 Javadoc 注释返回值参数
    异常说明外必须指出该方法做什事情实现什功
    说明:子类实现求者调注意事项请说明
    3 强制类必须添加创建者创建日期 阿里巴巴 Java 开发手册
    1738
    4 强制方法部单行注释注释语句方起行注释方法部行注释
    * *注释注意代码齐
    5 强制枚举类型字段必须注释说明数项途
    6 推荐半吊子英文注释中文注释问题说清楚专名词关键字保持
    英文原文
    反例:TCP 连接超时解释成传输控制协议连接超时理解反费脑筋
    7 推荐代码修改时注释进行相应修改尤参数返回值异常核心逻辑
    等修改
    说明:代码注释更新步路网导航软件更新步样果导航软件严重滞
    失导航意义
    8 参考谨慎注释掉代码方详细说明简单注释掉果删
    说明:代码注释掉两种性:1)续会恢复段代码逻辑2)永久前者果没
    备注信息难知晓注释动机者建议直接删掉(代码仓库保存历史代码)
    9 参考注释求:第够准确反应设计思想代码逻辑第二够描述业务含
    义程序员够迅速解代码背信息完全没注释段代码阅读者形
    天书注释隔长时间清晰理解时思路注释继者
    够快速接工作
    10 参考命名代码结构解释注释力求精简准确表达位避免出现注释
    极端:滥注释代码逻辑旦修改修改注释相负担
    反例:
    put elephant into fridge
    put(elephant fridge)
    方法名 put加两意义变量名 elephant fridge已说明干什语
    义清晰代码需额外注释
    11 参考特殊注释标记请注明标记标记时间注意时处理标记通标记扫描
    常清理类标记线障时候源标记处代码
    1) 办事宜(TODO)( 标记标记时间[预计处理时间])
    表示需实现目前未实现功实际 Javadoc 标签目前 Javadoc
    没实现已广泛应类接口方法( Javadoc 标签)
    2) 错误工作(FIXME)(标记标记时间[预计处理时间])
    注释中 FIXME 标记某代码错误工作需时纠正情况

    阿里巴巴 Java 开发手册
    1838
    (九)
    1 强制正表达式时利预编译功效加快正匹配速度
    说明:方法体定义:Pattern pattern Patterncompile(规)
    2 强制velocity 调 POJO 类属性时建议直接属性名取值模板引擎会动
    规范调 POJO getXxx()果 boolean 基数类型变量(boolean 命名需加 is
    前缀)会动调 isXxx()方法
    说明:注意果 Boolean 包装类象优先调 getXxx()方法
    3 强制台输送页面变量必须加{var}——中间感叹号
    说明:果 var 等 null 者存{var}会直接显示页面
    4 强制注意 Mathrandom() 方法返回 double 类型注意取值范围 0≤x<1(够
    取零值注意零异常)果想获取整数类型机数 x 放 10 干倍然
    取整直接 Random 象 nextInt 者 nextLong 方法
    5 强制获取前毫秒数 SystemcurrentTimeMillis() new Date()getTime()
    说明:果想获取更加精确纳秒级时间值 SystemnanoTime()方式 JDK8 中
    针统计时间等场景推荐 Instant 类
    6 推荐视图模板中加入复杂逻辑
    说明:根 MVC 理视图职责展示抢模型控制器活
    7 推荐数结构构造初始化应指定避免数结构限增长吃光存
    8 推荐时清理代码段配置信息
    说明:垃圾代码时配置坚决清理干净避免程序度臃肿代码冗余
    正例:暂时注释掉续恢复代码片断注释代码方统规定三
    斜杠()说明注释掉代码理
    阿里巴巴 Java 开发手册
    1938
    二异常日志
    () 异常处理
    1 强制Java 类库中定义通预检查方式规避 RuntimeException 异常应该通
    catch 方式处理:NullPointerExceptionIndexOutOfBoundsException 等等
    说明:法通预检查异常外解析字符串形式数字时通 catch
    NumberFormatException 实现
    正例:if (obj null) {}
    反例:try { objmethod() } catch (NullPointerException e) {…}
    2 强制异常做流程控制条件控制
    说明:异常设计初衷解决程序运行中种意外情况异常处理效率条件判断方式

    3 强制catch 时请分清稳定代码非稳定代码稳定代码指会出错代码
    非稳定代码 catch 进行区分异常类型做应异常处理
    说明:段代码进行 trycatch程序法根异常做出正确应激反应利
    定位问题种负责表现
    正例:户注册场景中果户输入非法字符户名称已存户输入密码
    简单程序作出分门类判断提示户
    4 强制捕获异常处理捕获什处理抛弃果想处理请
    该异常抛调者外层业务者必须处理异常转化户理解

    5 强制 try 块放事务代码中catch 异常果需回滚事务定注意手动回
    滚事务
    6 强制finally 块必须资源象流象进行关闭异常做 trycatch
    说明:果 JDK7 trywithresources 方式
    7 强制 finally 块中 return
    说明:finally 块中 return 返回方法结束执行会执行 try 块中 return 语句
    8 强制捕获异常抛异常必须完全匹配者捕获异常抛异常父类
    说明:果预期方抛绣球实际接铅球会产生意外情况
    9 推荐方法返回值 null强制返回空集合者空象等必须添加注释充分
    说明什情况会返回 null 值
    说明:手册明确防止 NPE 调者责调方法返回空集合者空象调阿里巴巴 Java 开发手册
    2038
    者说非高枕忧必须考虑远程调失败序列化失败运行时异常等场景返回
    null 情况
    10 推荐防止 NPE程序员基修养注意 NPE 产生场景:
    1)返回类型基数类型return 包装数类型象时动拆箱产生 NPE
    反例:public int f() { return Integer 象} 果 null动解箱抛 NPE
    2) 数库查询结果 null
    3) 集合里元素 isNotEmpty取出数元素 null
    4) 远程调返回象时律求进行空指针判断防止 NPE
    5) Session 中获取数建议 NPE 检查避免空指针
    6) 级联调 objgetA()getB()getC()连串调易产生 NPE
    正例: JDK8 Optional 类防止 NPE 问题
    11 推荐定义时区分 unchecked checked 异常避免直接抛出 new RuntimeException()
    更允许抛出 Exception 者 Throwable应业务含义定义异常推荐业界已定义
    定义异常:DAOException ServiceException 等
    12 参考公司外 httpapi 开放接口必须错误码应部推荐异常抛出
    跨应间 RPC 调优先考虑 Result 方式封装 isSuccess()方法错误码错误简
    短信息
    说明:关 RPC 方法返回方式 Result 方式理:
    1)抛异常返回方式调方果没捕获会产生运行时错误
    2)果加栈信息 new 定义异常加入理解 error message调
    端解决问题帮助会太果加栈信息频繁调出错情况数序列化传输
    性损耗问题
    13 参考避免出现重复代码(Don’t Repeat Yourself) DRY 原
    说明:意复制粘贴代码必然会导致代码重复需修改时需修改副
    容易遗漏必时抽取性方法者抽象公类甚组件化
    正例:类中 public 方法需进行数行相参数校验操作时候请抽取:
    private boolean checkParam(DTO dto) {}

    (二) 日志规约
    1 强制应中直接日志系统(Log4jLogback)中 API应赖日志框架
    SLF4J 中 API门面模式日志框架利维护类日志处理方式统
    import orgslf4jLogger
    import orgslf4jLoggerFactory

    private static final Logger logger LoggerFactorygetLogger(Abcclass) 阿里巴巴 Java 开发手册
    2138
    2 强制日志文件少保存 15 天异常具备周频次发生特点
    3 强制应中扩展日志(点时监控访问日志等)命名方式:
    appName_logType_logNamelog
    logType日志类型 statsmonitoraccess 等logName日志描述种命名处:
    通文件名知道日志文件属什应什类型什目利类查找
    正例:mppserver 应中单独监控时区转换异常:
    mppserver_monitor_timeZoneConvertlog
    说明:推荐日志进行分类错误日志业务日志分开存放便开发员查便
    通日志系统进行时监控
    4 强制 tracedebuginfo 级日志输出必须条件输出形式者占位符方

    说明:loggerdebug(Processing trade with id + id + and symbol + symbol)
    果日志级 warn述日志会印会执行字符串拼接操作果 symbol 象
    会执行 toString()方法浪费系统资源执行述操作终日志没印
    正例:(条件)建设采方式
    if (loggerisDebugEnabled()) {
    loggerdebug(Processing trade with id + id + and symbol + symbol)
    }
    正例:(占位符)
    loggerdebug(Processing trade with id {} and symbol {} id symbol)
    5 强制避免重复印日志浪费磁盘空间务必 log4jxml 中设置 additivityfalse
    正例:
    6 强制异常信息应该包括两类信息:案发现场信息异常堆栈信息果处理通
    关键字 throws 抛出
    正例:loggererror(类参数者象 toString() + _ + egetMessage() e)
    7 推荐谨慎记录日志生产环境禁止输出 debug 日志选择输出 info 日志果
    warn 记录刚线时业务行信息定注意日志输出量问题避免服务器磁盘
    撑爆记时删观察日志
    说明:量输出效日志利系统性提升利快速定位错误点记录日志时请
    思考:日志真?条日志做什?问题排查带处?
    8 推荐 warn 日志级记录户输入参数错误情况避免户投诉时适
    非必请场景出 error 级避免频繁报警
    说明:注意日志输出级error 级记录系统逻辑出错异常者重错误信息
    9 推荐量英文描述日志错误信息果日志中错误信息英文描述清楚话
    中文描述否容易产生歧义国际化团队海外部署服务器字符集问题强制
    全英文注释描述日志错误信息 阿里巴巴 Java 开发手册
    2238
    三单元测试
    1 强制单元测试必须遵守 AIR 原
    说明:单元测试线运行时感觉空气(AIR)样存测试质量保障
    非常关键单元测试宏观说具动化独立性重复执行特点
     A:Automatic(动化)
     I:Independent(独立性)
     R:Repeatable(重复)
    2 强制单元测试应该全动执行非交互式测试例通常定期执行执
    行程必须完全动化意义输出结果需工检查测试单元测试单元
    测试中准 Systemout 进行肉验证必须 assert 验证
    3 强制保持单元测试独立性保证单元测试稳定便维护单元测试例间
    决互相调赖执行先次序
    反例:method2 需赖 method1 执行执行结果作 method2 输入
    4 强制单元测试重复执行受外界环境影响
    说明:单元测试通常会放持续集成中次代码 check in 时单元测试会执行
    果单测外部环境(网络服务中间件等)赖容易导致持续集成机制
    正例:受外界环境影响求设计代码时 SUT 赖改成注入测试时 spring
    样 DI 框架注入(存)实现者 Mock 实现
    5 强制单元测试保证测试粒度足够助精确定位问题单测粒度类级
    般方法级
    说明:测试粒度出错时快定位出错位置单测负责检查跨类者跨系统
    交互逻辑集成测试领域
    6 强制核心业务核心应核心模块增量代码确保单元测试通
    说明:新增代码时补充单元测试果新增代码影响原单元测试请时修正
    7 强制单元测试代码必须写工程目录:srctestjava允许写业务代码目录
    说明:源码构建时会跳目录单元测试框架默认扫描目录
    8 推荐单元测试基目标:语句覆盖率达 70核心模块语句覆盖率分支覆盖率
    达 100
    说明:工程规约应分层中提 DAO 层Manager 层重度高 Service应该
    进行单元测试
    阿里巴巴 Java 开发手册
    2338
    9 推荐编写单元测试代码遵守 BCDE 原保证测试模块交付质量
     B:Border边界值测试包括循环边界特殊取值特殊时间点数序等
     C:Correct正确输入预期结果
     D:Design设计文档相结合编写单元测试
     E:Error强制错误信息输入(:非法数异常流程非业务允许输入等)
    预期结果
    10 推荐数库相关查询更新删等操作假设数库里数存
    者直接操作数库数插入进请程序插入者导入数方式准备数
    反例:删某行数单元测试数库中先直接手动增加行作删目标
    行新增数符合业务插入规导致测试结果异常
    11 推荐数库相关单元测试设定动回滚机制数库造成脏数者
    单元测试产生数明确前缀标识
    正例: RDC 部单元测试中 RDC_UNIT_TEST_前缀标识数
    12 推荐测代码建议做必重构代码变测避免达测试求
    书写规范测试代码
    13 推荐设计评审阶段开发员需测试员起确定单元测试范围单元测试
    覆盖测试例
    14 推荐单元测试作种质量保障手段建议项目发布补充单元测试例建议项
    目提测前完成单元测试
    15 参考更方便进行单元测试业务代码应避免情况:
     构造方法中做事情
     存全局变量静态方法
     存外部赖
     存条件语句
    说明:层条件语句建议卫语句策略模式状态模式等方式重构
    16 参考单元测试存误解:
     测试学干事情文开发手册文容开发学强相关
     单元测试代码余系统整体功单元部件测试正常否强相关
     单元测试代码需维护年半载单元测试处废弃状态
     单元测试线障没辩证关系单元测试够限度规避线障
    阿里巴巴 Java 开发手册
    2438
    四安全规约
    1 强制隶属户页面者功必须进行权限控制校验
    说明:防止没做水权限校验意访问修改删数查私信
    容修改订单
    2 强制户敏感数禁止直接展示必须展示数进行脱敏
    说明:中国陆手机号码显示158****9119隐藏中间 4 位防止隐私泄露
    3 强制户输入 SQL 参数严格参数绑定者 METADATA 字段值限定防止 SQL 注入
    禁止字符串拼接 SQL 访问数库
    4 强制户请求传入参数必须做效性验证
    说明:忽略参数校验导致:
     page size 导致存溢出
     恶意 order by 导致数库慢查询
     意重定
     SQL 注入
     反序列化注入
     正输入源串拒绝服务 ReDoS
    说明:Java 代码正验证客户端输入正写法验证普通户输入没问题
    果攻击员特殊构造字符串验证导致死循环结果
    5 强制禁止 HTML 页面输出未安全滤未正确转义户数
    6 强制表单AJAX 提交必须执行 CSRF 安全验证
    说明:CSRF(Crosssite request forgery)跨站请求伪造类常见编程漏洞存
    CSRF 漏洞应网站攻击者事先构造 URL受害者户访问台便户
    知情情况数库中户参数进行相应修改
    7 强制台资源譬短信邮件电话单支付必须实现正确防重放机
    制数量限制疲劳度控制验证码校验避免滥刷导致资损
    说明:注册时发送验证码手机果没限制次数频率利功骚扰
    户造成短信台资源浪费
    8 推荐发贴评发送时消息等户生成容场景必须实现防刷文容违禁词
    滤等风控策略
    阿里巴巴 Java 开发手册
    2538
    五MySQL 数库
    () 建表规约
    1 强制表达否概念字段必须 is_xxx 方式命名数类型 unsigned tinyint
    (1 表示0 表示否)
    说明:字段果非负数必须 unsigned
    注意:POJO 类中布尔类型变量加 is 前缀需设置
    is_xxx Xxx 映射关系数库表示否值 tinyint 类型坚持 is_xxx
    命名方式明确取值含义取值范围
    正例:表达逻辑删字段名 is_deleted1 表示删0 表示未删
    2 强制表名字段名必须写字母数字禁止出现数字开头禁止两划线中间
    出现数字数库字段名修改代价法进行预发布字段名称需慎重考虑
    说明:MySQL Windows 区分写 Linux 默认区分写数库名
    表名字段名允许出现写字母避免节外生枝
    正例:aliyun_adminrdc_configlevel3_name
    反例:AliyunAdminrdcConfiglevel_3_name
    3 强制表名复数名词
    说明:表名应该仅仅表示表里面实体容应该表示实体数量应 DO 类名单数
    形式符合表达惯
    4 强制禁保留字 descrangematchdelayed 等请参考 MySQL 官方保留字
    5 强制键索引名 pk_字段名唯索引名 uk_字段名普通索引名 idx_字段名
    说明:pk_ primary keyuk_ unique keyidx_ index 简称
    6 强制数类型 decimal禁止 float double
    说明:float double 存储时候存精度损失问题值较时
    正确结果果存储数范围超 decimal 范围建议数拆成整数数分开存储
    7 强制果存储字符串长度相等 char 定长字符串类型
    8 强制varchar 变长字符串预先分配存储空间长度超 5000果存储长
    度值定义字段类型 text独立出张表键应避免影响字段索
    引效率
    9 强制表必备三字段:id gmt_create gmt_modified
    说明:中 id 必键类型 bigint unsigned单表时增步长 1gmt_create
    gmt_modified 类型均 datetime 类型前者现时表示动创建者分词表示
    动更新 阿里巴巴 Java 开发手册
    2638
    10 推荐表命名加业务名称_表作
    正例:alipay_task force_project trade_config
    11 推荐库名应名称量致
    12 推荐果修改字段含义字段表示状态追加时需时更新字段注释
    13 推荐字段允许适冗余提高查询性必须考虑数致冗余字段应遵循:
    1)频繁修改字段
    2) varchar 超长字段更 text 字段
    正例:商品类目名称频率高字段长度短名称基成变相关联表中冗余存
    储类目名称避免关联查询
    14 推荐单表行数超 500 万行者单表容量超 2GB推荐进行分库分表
    说明:果预计三年数量根达级请创建表时分库分表
    15 参考合适字符存储长度节约数库表空间节约索引存储更重提升检
    索速度
    正例:表中符号值避免误存负数扩表示范围
    象 年龄区间 类型 字节 表示范围
    150 岁 tinyint unsigned 1 符号值:0 255
    龟 数百岁 smallint unsigned 2 符号值:0 65535
    恐龙化石 数千万年 int unsigned 4 符号值:0 约 429 亿
    太阳 约 50 亿年 bigint unsigned 8 符号值:0 约 10 19 次方

    (二) 索引规约
    1 强制业务具唯特性字段字段组合必须建成唯索引
    说明:唯索引影响 insert 速度速度损耗忽略提高查找速度明
    显外应层做非常完善校验控制没唯索引根墨菲定律必
    然脏数产生
    2 强制超三表禁止 join需 join 字段数类型必须绝致表关联查询时
    保证关联字段需索引
    说明:双表 join 注意表索引SQL 性
    3 强制 varchar 字段建立索引时必须指定索引长度没必全字段建立索引根
    实际文区分度决定索引长度 阿里巴巴 Java 开发手册
    2738
    说明:索引长度区分度矛盾体般字符串类型数长度 20 索引区分
    度会高达 90 count(distinct left(列名 索引长度))count(*)区分度
    确定
    4 强制页面搜索严禁左模糊者全模糊果需请走搜索引擎解决
    说明:索引文件具 BTree 左前缀匹配特性果左边值未确定法索

    5 推荐果 order by 场景请注意利索引序性order by 字段组合
    索引部分放索引组合序避免出现 file_sort 情况影响查询性
    正例:where a and b order by c 索引:a_b_c
    反例:索引中范围查找索引序性法利:WHERE a>10 ORDER BY b 索引
    a_b 法排序
    6 推荐利覆盖索引进行查询操作避免回表
    说明:果书需知道第 11 章什标题会翻开第 11 章应页?目录浏览
    目录起覆盖索引作
    正例:够建立索引种类分键索引唯索引普通索引三种覆盖索引种查
    询种效果 explain 结果extra 列会出现:using index
    7 推荐利延迟关联者子查询优化超分页场景
    说明:MySQL 跳 offset 行取 offset+N 行然返回放弃前 offset 行返回
    N 行 offset 特时候效率非常低控制返回总页数超
    特定阈值页数进行 SQL 改写
    正例:先快速定位需获取 id 段然关联:
    SELECT a* FROM 表 1 a (select id from 表 1 where 条件 LIMIT 10000020 ) b where aidbid
    8 推荐 SQL 性优化目标:少达 range 级求 ref 级果 consts

    说明:
    1)consts 单表中匹配行(键者唯索引)优化阶段读取数
    2)ref 指普通索引(normal index)
    3)range 索引进行范围检索
    反例:explain 表结果typeindex索引物理文件全扫描速度非常慢 index 级
    较 range 低全表扫描巫见巫
    9 推荐建组合索引时候区分度高左边
    正例:果 where a and b 果 a 列接唯值需单建 idx_a
    索引
    说明:存非等号等号混合时建索引时请等号条件列前置:where c> and
    d c 区分度更高必须 d 放索引前列索引 idx_d_c 阿里巴巴 Java 开发手册
    2838
    10 推荐防止字段类型造成隐式转换导致索引失效
    11 参考创建索引时避免极端误解:
    1)宁滥勿缺认查询需建索引
    2)宁缺勿滥认索引会消耗空间严重拖慢更新新增速度
    3)抵制惟索引认业务惟性律需应层通先查插方式解决

    (三) SQL 语句
    1 强制 count(列名) count(常量)代 count(*)count(*) SQL92 定义
    标准统计行数语法数库关 NULL 非 NULL 关
    说明:count(*)会统计值 NULL 行 count(列名)会统计列 NULL 值行
    2 强制count(distinct col) 计算该列 NULL 外重复行数注意 count(distinct
    col1 col2) 果中列全 NULL列值返回 0
    3 强制某列值全 NULL 时count(col)返回结果 0 sum(col)返回结果
    NULL sum()时需注意 NPE 问题
    正例:方式避免 sum NPE 问题:SELECT IF(ISNULL(SUM(g))0SUM(g))
    FROM table
    4 强制 ISNULL()判断否 NULL 值
    说明:NULL 值直接较 NULL
    1) NULL<>NULL 返回结果 NULL false
    2) NULLNULL 返回结果 NULL true
    3) NULL<>1 返回结果 NULL true
    5 强制 代码中写分页查询逻辑时 count 0 应直接返回避免执行面分页语句
    6 强制外键级联切外键概念必须应层解决
    说明:学生成绩关系例学生表中 student_id 键成绩表中 student_id
    外键果更新学生表中 student_id时触发成绩表中 student_id 更新
    级联更新外键级联更新适单机低发适合分布式高发集群级联更新强阻
    塞存数库更新风暴风险外键影响数库插入速度
    7 强制禁止存储程存储程难调试扩展更没移植性
    8 强制数订正(特删修改记录操作)时先 select避免出现误删确认
    误执行更新语句
    9 推荐in 操作避免避免实避免需仔细评估 in 边集合元素数量控
    制 1000 阿里巴巴 Java 开发手册
    2938
    10 参考果国际化需字符存储表示均 utf8 编码注意字符统计函数

    说明:
    SELECT LENGTH(轻松工作) 返回 12
    SELECT CHARACTER_LENGTH(轻松工作) 返回 4
    果需存储表情选择 utf8mb4 进行存储注意 utf8 编码区
    11 参考 TRUNCATE TABLE DELETE 速度快系统事务日志资源少 TRUNCATE
    事务触发 trigger造成事建议开发代码中语句
    说明:TRUNCATE TABLE 功带 WHERE 子句 DELETE 语句相

    (四) ORM 映射
    1 强制表查询中律 * 作查询字段列表需字段必须明确写明
    说明:1)增加查询分析器解析成2)增减字段容易 resultMap 配置致3)字
    段增加网络消耗尤 text 类型字段
    2 强制POJO 类布尔属性加 is数库字段必须加 is_求 resultMap 中进行
    字段属性间映射
    说明:参见定义 POJO 类数库字段定义规定中增加映射必须
    MyBatis Generator 生成代码中需进行应修改
    3 强制 resultClass 返回参数类属性名数库字段应需
    定义反表必然 POJO 类应
    说明:配置映射关系字段 DO 类解耦方便维护
    4 强制sqlxml 配置参数:#{}#param# {} 种方式容易出现 SQL 注入
    5 强制iBATIS 带 queryForList(String statementNameint startint size)推

    说明:实现方式数库取 statementName应SQL语句记录通 subList
    取 startsize 子集合
    正例:Map map new HashMap<>()
    mapput(start start)
    mapput(size size)
    6 强制允许直接 HashMap Hashtable 作查询结果集输出
    说明:resultClassHashtable会置入字段名属性值值类型控
    7 强制更新数表记录时必须时更新记录应 gmt_modified 字段值前时间 阿里巴巴 Java 开发手册
    3038
    8 推荐写全数更新接口传入 POJO 类目标更新字
    段进行 update table set c1value1c2value2c3value3 执行 SQL
    时更新改动字段易出错二效率低三增加 binlog 存储
    9 参考@Transactional 事务滥事务会影响数库 QPS外事务方需
    考虑方面回滚方案包括缓存回滚搜索引擎回滚消息补偿统计修正等
    10 参考中 compareValue 属性值常量般数字表示相等时带
    条件表示空 null 时执行表示 null 值时
    执行 阿里巴巴 Java 开发手册
    3138
    六工程结构
    () 应分层
    1 推荐图中默认层赖层箭头关系表示直接赖:开放接口层赖
    Web 层直接赖 Service 层类推:

     开放接口层:直接封装 Service 方法暴露成 RPC 接口通 Web 封装成 http 接口进行
    网关安全控制流量控制等
     终端显示层:端模板渲染执行显示层前 velocity 渲染JS 渲染
    JSP 渲染移动端展示等
     Web 层:访问控制进行转发类基参数校验者复业务简单处理等
     Service 层:相具体业务逻辑服务层
     Manager 层:通业务处理层特征:
    1) 第三方台封装层预处理返回结果转化异常信息
    2) Service 层通力沉缓存方案中间件通处理
    3) DAO 层交互 DAO 组合复
     DAO 层:数访问层底层 MySQLOracleHbase 等进行数交互
     外部接口第三方台:包括部门 RPC 开放接口基础台公司 HTTP 接口
    2 参考 (分层异常处理规约) DAO 层产生异常类型法细粒度异常进
    行 catch catch(Exception e)方式 throw new DAOException(e)需印
    日志日志 ManagerService 层定需捕获印日志文件中果台服务
    器日志浪费性存储 Service 层出现异常时必须记录出错日志磁盘
    带参数信息相保护案发现场果 Manager 层 Service 机部署日志方式 DAO
    层处理致果单独部署采 Service 致处理方式Web 层绝应该继续
    抛异常已处顶层果意识异常导致页面法正常渲染应该直接阿里巴巴 Java 开发手册
    3238
    跳转友错误页面加户容易理解错误提示信息开放接口层异常处理成错误码
    错误信息方式返回
    3 参考分层领域模型规约:
     DO(Data Object):象数库表结构应通 DAO 层传输数源象
     DTO(Data Transfer Object):数传输象Service Manager 外传输象
     BO(Business Object):业务象 Service 层输出封装业务逻辑象
     AO(Application Object):应象 Web 层 Service 层间抽象复象模型
    极贴展示层复度高
     VO(View Object):显示层象通常 Web 模板渲染引擎层传输象
     Query:数查询象层接收层查询请求注意超 2 参数查询封装禁止
    Map 类传输

    (二) 二方库赖
    1 强制定义 GAV 遵规:
    1) GroupID 格式:com{公司BU }业务线 [子业务线] 4 级
    说明:{公司BU} 例:alibabataobaotmallaliexpress 等 BU 级子业务线选
    正例:comtaobaojstorm comalibabadubboregister
    2) ArtifactID 格式:产品线名模块名语义重复遗漏先中央仓库查证
    正例:dubboclient fastjsonapi jstormtool
    3) Version:详细规定参考方
    2 强制二方库版号命名方式:版号次版号修订号
    1) 版号:产品方改变者规模 API 兼容者架构兼容升级
    2) 次版号:保持相兼容性增加功特性影响范围极 API 兼容修改
    3) 修订号:保持完全兼容性修复 BUG新增次功特性等
    说明:注意起始版号必须:100 001 正式发布类库必须先中央仓库进
    行查证版号延续性正式版号允许覆盖升级前版:133
    合理版号:134 140 200
    3 强制线应赖 SNAPSHOT 版(安全包外)
    说明:赖 SNAPSHOT 版保证应发布幂等性外加快编译时包构建
    4 强制二方库新增升级保持功点外 jar 包仲裁结果变果改变
    必须明确评估验证建议进行 dependencyresolve 前信息果仲裁结果完全
    致通 dependencytree 命令找出差异点进行排 jar 包 阿里巴巴 Java 开发手册
    3338
    5 强制二方库里定义枚举类型参数枚举类型接口返回值允许枚
    举类型者包含枚举类型 POJO 象
    6 强制赖二方库群时必须定义统版变量避免版号致
    说明:赖 springframeworkcorecontextbeans版定义
    变量保存版:{springversion}定义赖时候引该版
    7 强制禁止子项目 pom 赖中出现相 GroupId相 ArtifactId
    Version
    说明:调试时会子项目指定版号合成 war版号
    出现 lib 目录中出现线调试正确发布线出障问题
    8 推荐 pom 文件中赖声明放语句块中版仲裁放
    语句块中
    说明:里声明版实现引入子项目需显式声
    明赖version scope 读取父 pom声明 pom
    里赖会动引入默认子项目继承
    9 推荐二方库配置项低限度增加配置项
    10 参考避免应二方库赖突问题二方库发布者应遵循原:
    1)精简控原移切必 API 赖包含 Service API必领域模型
    象Utils 类常量枚举等果赖二方库量 provided 引入二方库
    者赖具体版号 log 具体实现赖日志框架
    2)稳定追溯原版变化应该记录二方库谁维护源码里需
    方便查非户动升级版否公二方库行应该发生变化

    (三) 服务器
    1 推荐高发服务器建议调 TCP 协议 time_wait 超时时间
    说明:操作系统默认 240 秒会关闭处 time_wait 状态连接高发访问服
    务器端会处 time_wait 连接数太法建立新连接需服务器
    调等值
    正例: linux 服务器请通变更etcsysctlconf 文件修改该缺省值(秒):
    netipv4tcp_fin_timeout 30
    2 推荐调服务器支持文件句柄数(File Descriptor简写 fd)
    说明:流操作系统设计 TCPUDP 连接采文件样方式理连接
    应 fd流 linux 服务器默认支持 fd 数量 1024发连接数时阿里巴巴 Java 开发手册
    3438
    容易 fd 足出现open too many files错误导致新连接法建立 建议 linux
    服务器支持句柄数调高数倍(服务器存数量相关)
    3 推荐 JVM 环境参数设置XX+HeapDumpOnOutOfMemoryError 参数 JVM 碰 OOM 场
    景时输出 dump 信息
    说明:OOM 发生概率甚相隔数月出现例出错时堆信息解决问题非常
    帮助
    4 推荐线生产环境JVM Xms Xmx 设置样存容量避免 GC 调整堆
    带压力
    5 参考服务器部重定 forward外部重定址 URL 拼装工具类生成否
    会带 URL 维护致问题潜安全风险
    阿里巴巴 Java 开发手册
    3538
    七设计规约
    1 强制存储方案底层数结构设计获评审致通沉淀成文档
    说明:缺陷底层数结构容易导致系统风险升扩展性降重构成会历史数
    迁移系统滑渡陡然增加存储方案数结构需认真进行设计评审
    生产环境提交执行需进行 double check
    正例:评审容包括存储介质选型表结构设计否满足技术方案存取性存储空间否
    满足业务发展表字段间辩证关系字段名称字段类型索引等数结构变更(
    原表中新增字段)需进行评审通线
    2 强制需求分析阶段果系统交互 User 超类相关 User Case 超 5
    例图表达更加清晰结构化需求
    3 强制果某业务象状态超 3 状态图表达明确状态变化触发
    条件
    说明:状态图核心象状态首先明确象少种状态然明确两两状态间否存
    直接转换关系明确触发状态转换条件什
    正例:淘宝订单状态已单付款已付款发货已发货已收货等已单
    已收货两种状态间直接转换关系
    4 强制果系统中某功调链路涉象超 3 时序图表达明确
    调环节输入输出
    说明:时序图反映系列象间交互协作关系清晰立体反映系统调深链路
    5 强制果系统中模型类超 5 存复杂赖关系类图表达明确类
    间关系
    说明:类图建筑领域施工图果搭房需果建造蚂蚁 Z 空间楼肯
    定需详细施工图
    6 强制果系统中超 2 象间存协作关系需表示复杂处理流程活
    动图表示
    说明:活动图流程图扩展增加够体现协作关系象泳道支持表示发等
    7 推荐需求分析系统设计考虑干功时需充分评估异常流程业务边界
    反例:户淘宝付款程中银行扣款成功发送户扣款成功短信支付宝入款时
    断网演练产生异常淘宝订单页面然显示未付款导致户投诉 阿里巴巴 Java 开发手册
    3638
    8 推荐类设计实现时符合单原
    说明:单原易理解难实现条规着系统演进时候忘记类设计
    初衷
    9 推荐谨慎继承方式进行扩展优先聚合组合方式实现
    说明:已继承话必须符合里氏代换原原说父类够出现方子类定
    够出现钱交出钱子类美元欧元民币等出现
    10推荐系统设计时根赖倒置原量赖抽象类接口利扩展维护
    说明:低层次模块赖高层次模块抽象方便系统间解耦
    11推荐系统设计时注意扩展开放修改闭合
    说明:极端情况交付代码修改业务域需求变化通模块类
    扩展实现
    12推荐系统设计阶段性业务公行抽取出公模块公配置公类公方
    法等避免出现重复代码重复配置情况
    说明:着代码重复次数断增加维护成指数级升
    13 推荐避免误解:敏捷开发 讲事 + 编码 + 发布
    说明:敏捷开发快速交付迭代系统省略余设计方案摒弃传统审批流程
    核心关键点必设计文档沉淀需
    反例:某团队业务快速发展敏捷成产品理催进度口系统中均勉强运行
    面条样代码维护性扩展性极差年进行规模重构偿失
    14参考系统设计目明确需求理逻辑期维护次目指导编码
    说明:避免设计设计系统设计文档助期系统维护设计结果需进行分
    类档保存
    15参考设计质识表达系统难点找系统变化点隔离变化点
    说明:世间众设计模式目相隔离系统变化点
    16 参考系统架构设计目:
     确定系统边界确定系统技术层面做做
     确定系统模块间关系确定模块间赖关系模块宏观输入输出
     确定指导续设计演化原续子系统模块设计规定框架继续演化
     确定非功性需求非功性需求指安全性性扩展性等
    阿里巴巴 Java 开发手册
    3738
    附 1:版历史
    版号 更新日期 备注
    100 201729 阿里巴巴集团正式外发布
    101 2017213
    1)修正 String[]前矛盾2)vm 修正成 velocity3)修正 countdown 描述错

    102 2017220
    1)文底水印2)数类型中引太阳系年龄问题3)修正关异常方法签名部
    分描述4)修正 final 描述5) Comparator 部分描述
    110 2017227
    1)增加前言2)增加< extends T>描述说明3)增加版历史4)增加专名
    词解释
    111 2017331 修正页码总数部分示例
    120 2017520
    1)根云栖社区聚聊活动反馈手册页码排版描述进行修正2)增加
    final 适场景描述3)增加关锁粒度说明4)增加指定集合详细
    说明正反例5)增加卫语句示例代码6)明确数库表示删概念字段名
    is_deleted
    130 2017925
    增加单元测试规约(PDF 终极版)阿里开源 IDE 代码规约检测插件:点载
    更时信息请关注阿里巴巴 Java 开发手册官方公众号:

    131 20171130 修正部分描述采 P3C 开源 IDE 检测插件相 Apache20 协议
    140 2018520 增加设计规约(详版)
    阿里巴巴 Java 开发手册
    3838
    附 2:专名词解释
    1 POJO(Plain Ordinary Java Object) 手册中POJO 专指 setter getter
    toString 简单类包括 DODTOBOVO 等
    2 GAV(GroupIdArtifactctIdVersion) Maven 坐标唯标识 jar 包
    3 OOP(Object Oriented Programming) 手册泛指类象编程处理方式
    4 ORM(Object Relation Mapping) 象关系映射象领域模型底层数间转换
    文泛指 iBATIS mybatis 等框架
    5 NPE(javalangNullPointerException) 空指针异常
    6 SOA(ServiceOriented Architecture) 面服务架构根需求通网络松散
    耦合粗粒度应组件进行分布式部署组合利提升组件重性维护性
    7 IDE(Integrated Development Environment) 提供程序开发环境应程序般
    包括代码编辑器编译器调试器图形户界面等工具手册泛指 IntelliJ IDEA
    eclipse
    8 OOM(Out Of Memory) 源 javalangOutOfMemoryError JVM 没足够存
    象分配空间垃圾回收器法回收空间时系统出现严重状况
    9 方库 工程部子项目模块赖库(jar 包)
    10 二方库 公司部发布中央仓库供公司部应赖库(jar 包)
    11 三方库 公司外开源库(jar 包)











    阿里巴巴 Java 开发手册
    3938


    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载pdf到电脑,查找使用更方便

    pdf的实际排版效果,会与网站的显示效果略有不同!!

    需要 2 香币 [ 分享pdf获得香币 ]

    下载pdf

    相关文档

    阿里巴巴校园招聘笔试试题(java)

    阿里巴巴java笔试java笔试Question 1. (单选)在60年代初石油危机的时候,美国总统肯尼迪要求美国石油公司不要将石油的价格提得太快,但是美国石油公司拒绝了肯尼迪的要求。因此,肯...

    10年前   
    407    0

    阿里巴巴校园招聘笔试试题(java)

    阿里巴巴java笔试java笔试Question 1. (单选)在60年代初石油危机的时候,美国总统肯尼迪要求美国石油公司不要将石油的价格提得太快,但是美国石油公司拒绝了肯尼迪的要求。因此,肯...

    10年前   
    406    0

    Java开发工程师工作职责2021职责

    Java开发工程师工作职责2021职责1、参与应用平台的设计和开发,负责应用平台核心功能模块设计、核心代码开发;2、参与业务需求、产品需求讨论,负责实施方案设计,技术原形实现,模块化代码实现;...

    2年前   
    474    0

    java开发实习周记25篇

    java开发实习周记25篇  第一周  实习第一个礼拜,算是适应期。主要了解一些公司的背景、产品、发展方向等。刚到实习公司,不是像学校里的朝九晚五,而是朝八晚九。 我们不可能简单的了解一些企业...

    9年前   
    905    0

    java开发工程师的求职信

    java开发工程师的求职信第一篇:java软件工程师求职信尊敬的领导:您好!首先衷心感谢您在百忙之中浏览我的自荐信,为一位满腔热情的大学生开启一扇希望之门。我叫王海艳,是一名即将于2014年7...

    12年前   
    508    0

    敏捷开发中高质量Java代码开发实践

    本文将介绍在敏捷开发过程中如何通过采取一系列的步骤来保证和提高整个工程的代码质量,阐述了每一步可以利用的工具和最正确实践,从而使开发过程更加标准化,成就高质量的代码。概述Java 工程开发过程...

    2年前   
    282    0

    阿里巴巴_java_研发成功笔面试总结

    阿里巴巴校园招聘java研发成功笔面试总结-2012校园招聘没想到这么快就拿到了一个offer了,放佛做梦一般。谢师兄经常教育我们要学会分享,所以我决定写点什么给大家,也为自己攒点rp吧。 ...

    9年前   
    398    0

    阿里巴巴_java_研发成功笔面试总结

    阿里巴巴校园招聘java研发成功笔面试总结-2012校园招聘没想到这么快就拿到了一个offer了,放佛做梦一般。谢师兄经常教育我们要学会分享,所以我决定写点什么给大家,也为自己攒点rp吧。 ...

    12年前   
    492    0

    开发计划编写规范

     开发计划编写规范 文件编号: NW504101 ...

    12年前   
    19781    0

    基于java的坦克大战游戏开发毕业设计

     毕业设计说明书(论文) 作 者: 学 号: 院 系: 专 业...

    5年前   
    1290    0

    Java开发工程师工作职责最全归纳

    Java开发工程师工作职责最全归纳1、负责互联网平台的架构分析、设计和代码的编写;2、负责项目框架搭建、关键技术选型、技术难题攻关;3、按照产品需求进行开发工作并保证开发质量;4、针对Java...

    2年前   
    498    0

    关于Java开发工程师工作职责精编汇总

    关于Java开发工程师工作职责精编汇总1.负责互联网系统后端模块的开发和测试;2.与前端开发、运营、测试团队合作完成整个项目开发;3.编写及维护软件功能规格说明书,设计及开发过程中产生的系列文...

    2年前   
    426    0

    腾讯面试-移动JAVA开发

    1)笔试:c++,基础题目与程序员考试水平相当。  附加题:  1.有10亿个浮点数,从中找出1万个最大的数。写一个高性能的算法  2.unix后台进程的实现  3.mfc的多文档模板的加载 ...

    9年前   
    441    0

    2017年java程序开发毕业论文参考文献

    java程序开发毕业论文参考文献  java毕业论文参考文献一:  [1] 韦乐平. 三网融合的思考[j]. 电信科学, XX (3): 1-6.  [2] 柴雪芳. 国外移动互联网的发展及对...

    7年前   
    533    0

    基于java开发的一个网站购物系统

    摘 要 随着21世纪的到来,计算机技术向着集成化和网络化的方向发展。单一计算机应用软件正在逐渐的淘汰,新一代的支持多种数据信息的网络版本应用软件正逐渐取而代之。信息化社会高效的办公方式正在对落...

    7个月前   
    154    0

    高级Java开发工程师岗位职责表述

    高级Java开发工程师岗位职责表述1、参与产品设计:根据业务需求,积极参与产品的讨论、定义、设计等工作;2、技术文档编写:按照公司软件开发管理规范要求,根据上级分配的任务,编制软件开发详细设计...

    2年前   
    418    0

    Java开发工程师工作职责2021工作职责

    Java开发工程师工作职责2021工作职责1.负责公司相关产品的详细设计、开发工作,包括参与需求分析、数据库结构设计、核心代码开发;2. 维护和完善软件产品和系统,快速定位并修复相关缺陷,及时...

    2年前   
    440    0

    java开发助理岗位职责范本

    java开发助理岗位职责范本1.搭建系统开发环境,完成系统框架和核心代码的实现;2.按时按质完成开发任务与相关开发文档;3.负责解决开发过程中的技术问题;4.参与代码维护与备份;java开发助...

    2年前   
    650    0

    阿里集团人力开发现状及分析

     阿里集团人力开发现状及分析一、 阿里巴巴战略内容的变迁2006年,马云在电子商务研讨会上提出中国电子商务发展将经历三个阶段,即信息流阶段、资金流阶段和物流阶段...

    8年前   
    617    0

    java教案

    设计摘要专业 物联网 课程 Java程序设计课时 1 课型 理论+实践班级 18级物联网教材 零基础学Java-明日科技出版章节 面向对象核心技术

    4年前   
    808    0