阿里巴巴Java开发手册及健康的编程命名总结

网络上对于64位环境,特别是server2008的安装ocs服务器参考资料较少,特此记录一下。

在单机的虚拟环境下集成和测试演练比较方便。

一律、编程规约
(一) 命名规约
1.
【强制】所有编程相关命名均无克以下划线或美元符号开始,也无可知以下划线或美元符号结束。
反例: _name / __name / $Object / name_ / name$ / Object$
2.
【强制】所有编程相关的命名严禁用拼音与英文混合的主意,更非允直接利用中文的法门。
证实:正确的英文拼写及语法可以让阅读者易于掌握,避免歧义。注意,即使纯拼音命名方式
也只要避免用。
反例: DaZhePromotion [打折] / getPingfenByName() [评分] / int 变量
= 3;
正例: ali / alibaba / taobao / cainiao / aliyun / youku / hangzhou
等国际通用的
名,可身为英文。

VMWare7的安装

以32各类系统上但发一定的CPU才会安装64各的Server 2008体系

不过好当64之网上安64员的虚拟机

测试用,一个服务器安装有软件即可

纱不要动NAT模式,否则虚拟机和主机里无法通过IP通讯,设置成Bridge模式

  1. 【强制】类名使用 UpperCamelCase
    风格,必须遵循驼峰形式,但以下情形不同:(领域模型 的系命名)DO / DTO
    / VO / DAO 等。
    正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
    反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
  2. 【强制】方法名、参数叫做、成员变量、局部变量都统一行使 lowerCamelCase
    风格,必须遵守
    驼峰形式。
    正例: localValue / getHttpMessage() / inputUserId
    5.
    【强制】常量命名全部大写,单词里用生划线隔开,力求语义表达完清楚,不要嫌名字长。
    正例: MAX_STOCK_COUNT
    反例: MAX_COUNT
  3. 【强制】抽象类命名使用 Abstract 或 Base 开头;异常类命名使用
    Exception 结尾;测试类命 名以其如果测试的近乎的名目开始,以 Test 结尾。
    阿里巴巴 JAVA 开发手册
    2 / 32

  4. 【强制】中括号是数组类型的相同有的,数组定义如下:String[] args;
    反例:请不以 String args[]的法子来定义

  5. 【强制】POJO 类中之别布尔类型的变量,都不要加
    is,否则有框架解析会引起序列化错
    误。
    反例:定义为主导数据列 boolean isSuccess;的习性,它的法为是
    isSuccess(),RPC
    框架在反往解析的时候,“以为”对应之性名称是
    success,导致性获取不至,进而抛出
    异常。
    9.
    【强制】包名统一行使小写,点分隔符之间来且仅发生一个自然语义的英语单词。包名统一以
    单数形式,但是类名如果来复数含义,类名可以动用复数形式。
    正例: 应用工具类包名为 com.alibaba.mpp.util、类名为
    MessageUtils(此规则参考 spring
    的框架结构)
    10.【强制】杜绝了无标准之缩写,避免望文不知义。
    反例:<某工作代码>AbstractClass“缩写”命名成
    AbsClass;condition“缩写”命名成
    condi,此类随意缩写严重低落了代码的但是阅读性。
    11.【推荐】如果使用到了设计模式,建议于类名中反映出切实可行模式。
    说明:将设计模式体现于名字中,有利于阅读者快速解架构设计思想。
    正例:public class OrderFactory;
    public class LoginProxy;
    public class ResourceObserver;
    12.【推荐】接口类中的章程和性质不设加其余修饰符号(public
    也不要加),保持代码的简短
    性格,并加上有效之 javadoc
    注释。尽量不要以接口里定义变量,如果一定要是定义变量,肯定是
    暨接口方法有关,并且是全应用之基本功常量。
    正例:接口方法签名:void f();
    接口基础常量表示:String COMPANY = “alibaba”;
    反例:接口方法定义:public abstract void f();
    证实:JDK8 中接口允许发生默认实现,那么这 default
    方法,是指向拥有实现类似都有价的沉默
    认实现。
    13.接口及实现类似的命名有有限学规则:
    1)【强制】对于 Service 和 DAO 类,基于 SOA
    的视角,暴露出来的劳务得是接口,内部
    的兑现类用 Impl 的后缀与接口区别。
    正例:CacheServiceImpl 实现 CacheService 接口。
    阿里巴巴 JAVA 开发手册
    3 / 32

Windows Server2008 R2(x64)安装

服务器的不可或缺条件优先安排好

2)【推荐】
如果是写能力的接口名称,取对应之形容词做接口名(通常是–able 的来得
式)。
正例:AbstractTranslator 实现 Translatable。
14.【参考】枚举类名建议带及 Enum
后缀,枚举成员称需要全大写,单词里用生划线隔开。
征:枚举其实就是特之常量类,且构造方法被默认强制是自私出。
正例:枚举名字:DealStatusEnum;成员称:SUCCESS / UNKOWN_REASON。
15.【参考】各层命名规则:
A) Service/DAO 层方法命名规则
1) 获取单个对象的法用 get 做前缀。
2) 获取多独对象的措施用 list 做前缀。
3) 获取统计值的方式用 count 做前缀。
4) 插入的法子用 save(推荐)或 insert 做前缀。
5) 删除的主意用 remove(推荐)或 delete 做前缀。
6) 修改的法用 update 做前缀。
B) 领域模型命名规则
1) 数据对象:xxxDO,xxx 即为数表名。
2) 数据传对象:xxxDTO,xxx 为业务领域相关的称号。
3) 展示对象:xxxVO,xxx 一般为网页名称。
4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。
(二) 常量定义

须装的服务器角色

Active Directory 域服务: 默认安装项,域功能级别选择Windows
2003(DNS服务器在斯设置后便闹了)

Active Directory 证书服务:
证书颁发机构、证书颁发机构Web注册(用于IE中拿走证件)

Web服务器(IIS): IIS6 管理兼容必须装

应用程序服务器: 默认的TCP端口共享、Windows进程激活即可

  1. 【强制】不同意出现任何魔法值(即未经定义之常量)直接出现于代码中。
    反例: String key=”Id#taobao_”+tradeId;
    cache.put(key, value);
  2. 【强制】long 或者 Long 初始赋值时,必须使大写的 L,不克是小写的
    l,小写好和数字 1 混淆,造成误解。
    证明:Long a = 2l; 写的凡数字之 21,还是 Long 型的 2?
    3.
    【推荐】不要以一个常量类保护有常量,应该仍常量功能拓展分类,分开维护。如:缓存
    相关的常量放在类:CacheConsts 下;系统安排相关的常量放在类:ConfigConsts
    下。
    征:大如全的常量类,非得 ctrl+f
    才定位及修改的常量,不便民理解,也无便民保护。
    阿里巴巴 JAVA 开发手册
    4 / 32

要安装的服务器功能

信息队列:消息队列服务器、目录服务并两独必须装

桌面体验: 主要是安装Media Format Runtime

4.
【推荐】常量的复用层次来五重叠:跨应用共享常量、应用内共享常量、子工程外共享常量、包
外共享常量、类内共享常量。
1) 跨应用共享常量:放置于二方库中,通常是 client.jar 中的 const
目录下。
2) 应用内共享常量:放置在一方库的 modules 中之 const 目录下。
反例:易掌握变量也如联合定义成应用内共享常量,两位攻城师在片个像样中分别定义了代表
“是”的变量:
类 A 中:public static final String YES = “yes”;
类 B 中:public static final String YES = “y”;
A.YES.equals(B.YES),预期是 true,但实在返回吗
false,导致有线及问题。
3) 子工程中共享常量:即于当前子工程的 const 目录下。
4) 包内共享常量:即以眼前包下单独的 const 目录下。
5) 类内共享常量:直接在看似里 private static final 定义。

Sql Server 2008 R2(x64)安装

要是安装数据库服务

  1. 【推荐】如果变量值仅在一个限外浮动用 Enum
    类。如果还蕴藏名称之外的延伸属性,必须 使用 Enum
    类,下面正例中的数字就是延伸信息,表示星期几。
    正例:public Enum{ MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4),
    FRIDAY(5),
    SATURDAY(6), SUNDAY(7);}
    (三) 格式规约
    1.
    【强制】大括号的施用约定。如果是大括哀号内为空,则简洁地勾勒成{}即可,不待换行;如果
    是非空代码块则:
    1) 左大括号前不换行。
    2) 左大括号后换行。
    3) 右大括号前换行。
    4) 右大括号后还有 else 等代码则未换行;表示已右大括哀号晚必换行。
  2. 【强制】
    左括号和后一个字符中无出新空格;同样,右括号与前边一个字符中吧无出现空
    格。详见第 5 长长的凡正例提示。
  3. 【强制】if/for/while/switch/do 等保留字与左右括号中都得加空格。
  4. 【强制】任何运算符左右必须加以一个空格。
    说明:运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号、三张运行符等。
  5. 【强制】代码块缩进 4 单空格,如果下 tab 缩进,请设置成 1 只 tab 为
    4 独空格。 正例: (涉及 1-5 点)
    阿里巴巴 JAVA 开发手册
    5 / 32

OCS 2007 R2安装

执行setupee.exe

1、  准备条件

a)         准备AD: 按照步骤准备,建立DNS记录(池底域名)

b)         创建公司版池

c)         配置池

2、  部署存档、监控服务服务器

a)         其他服务器角色:存档

b)         其他服务器角色:监控

3、  将Server加到池塘中

a)         按照提供的手续一步步实施完毕即可

4、  部署外服务器

a)         Web 访问角色

b)         中介服务器等等

5、  OCS管理工具安装

6、  管理工具使用

a)         启用TCP等另外设置

b)         用户启用

c)         …

 注意:

1、  用户增长后需要以用户管理遭启用OCS功能

2、 
远程应用OCS客户端时,TLS连接形式要设置证书,从服务器下载;TCP连接就毫无证书

 

一部分安截图参考:

http://www.cnblogs.com/liuyuhua/archive/2010/06/20/1761248.html

以此稿子非常好,不过安装之顺序不太规范。

public static void main(String args[]) { // 缩进 4 只空格 String say =
“hello”; // 运算符的横必须产生一个空格 int flag = 0; // 关键词 if
与括号内必须有一个空格,括号内 f 与左括哀号,1 同右括号不欲空格 if
(flag == 0) { System.out.println(say); } //
左大括如泣如诉前方加空格且不换行;左大括号后更换行 if (flag == 1) {
System.out.println(“world”); // 右大括号前换行,右大括声泪俱下后出
else,不用换行 } else { System.out.println(“ok”); //
右大括号举行吗结束,必须改换行 } } 6. 【强制】单行字符数限制不超过 120
独,超出需要换行,换行时,遵循如下原则: 1) 换行时相对上一行缩进 4
单空格。
2) 运算符与下文一起换行。
3) 方法调用的点符号与下文一起换行。
4) 在差不多只参数超长,逗号后开展换行。
5) 在括号前不要换行,见反例。
正例:
StringBuffer sb = new StringBuffer(); //超过 120
独字符的状况下,换行缩进 4 个空格,并且方法前的点符号一起换行
sb.append(“zi”).append(“xin”)… .append(“huang”);
反例:
StringBuffer sb = new StringBuffer(); //超过 120
单字符的气象下,不要在括号前换行 sb.append(“zi”).append(“xin”)…append
(“huang”);

//参数很多的章程调用也超 120 单字符,逗号后才是换行处 method(args1,
args2, args3, … , argsX); 7.
【强制】方法参数在概念跟传播时,多个参数逗号后边必须加空格。
正例:下例中实参的”a”,后止必须使出一个空格。
method(“a”, “b”, “c”);
阿里巴巴 JAVA 开发手册
6 / 32

8.
【推荐】没有必要增加多空格来如有平等履行的字符与达一行的应和字符对伙同。
正例:
int a = 3; long b = 4L; float c = 5F; StringBuffer sb = new
StringBuffer(); 说明:增加 sb 这个变量,如果急需对共同,则让 a、b、c
都使追加几个空格,在变量比较多之
状况下,是平等栽累赘的业务。

  1. 【强制】IDE 的 text file encoding 设置也 UTF-8; IDE
    中文件的换行符使用 Unix 格式,不 要使用 windows 格式。
    10.【推荐】方法体内的推行语句组、变量的概念语句组、不同的业务逻辑中还是不同之语义之
    里面插入一个空行。相同业务逻辑与语义之间无需插入空行。
    证实:没有必要插入多执空格进行分隔开。
    (四) OOP 规约
    1.
    【强制】避免通过一个看似的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成
    本,直接用类名来访问即可。
  2. 【强制】所有的覆写方法,必须加@Override 注解。 反例:getObject()与
    get0bject()的题材。一个凡是字母之 O,一个凡数字之 0,加@Override
    足规范判断是否覆盖成功。另外,如果当抽象类吃对艺术签名进行改动,其实现类会马上造
    译报错。
  3. 【强制】相同参数类型,相同业务含义,才好使 Java
    的可变参数,避免下 Object。
    说明:可转移参数必须放于参数列表的末尾。(提倡同学等尽量不用而变换参数编程)
    正例:public User getUsers(String type, Integer… ids); 4.
    【强制】对外暴露的接口签名,原则达成不同意修改章程签名,避免对接口调用方产生潜移默化。接
    口过时必须加@Deprecated
    注解,并清晰地证实下的初接口或者新劳动是啊。
  4. 【强制】不能够使用老式的切近还是措施。 说明:java.net.URLDecoder 中之法子
    decode(String encodeStr) 这个方式都过时,应该
    应用对参数 decode(String source, String
    encode)。接口提供方既然明确是不合时宜接口,那
    呢有白而提供新的接口;作为调用方来说,有分文不取去考证过时方法的初实现是什么。
    6.
    【强制】Object的equals方法好抛空指针异常,应运用常量或确定有值的目标来调用equals。

正例: “test”.equals(object);
阿里巴巴 JAVA 开发手册
7 / 32

反例: object.equals(“test”);
征:推荐使用 java.util.Objects#equals (JDK7 引入的工具类)

  1. 【强制】所有的同样类别的包装类对象之间值的可比,全部施用 equals
    方法较。
    证明:对于 Integer var=?在-128 至 127 之间的赋值,Integer 对象是当
    IntegerCache.cache
    发出,会复用已起对象,这个距离内之 Integer
    值可以一直行使==进行判断,但是是区间的
    他的装有数据,都见面在积上发,并无会见复用已发出对象,这是一个大坑,推荐应用
    equals 方
    效仿开展判断。
  2. 【强制】关于基本数据类及包装数据类型的施用专业如下: 1) 所有的
    POJO 类属性必须使包装数据类型。
    2) RPC 方法的返回值和参数必须下包装数据类型。
    3) 所有的片段变量推荐下基本数据类。
    证实:POJO
    类属性没有初值是提示使用者在得以时,必须团结显式地拓展赋值,任何
    NPE 问题,或者入库检查,都由使用者来保证。
    正例:数据库的询问结果也许是 null,因为电动拆箱,用为重数据列接收有
    NPE 风险。
    反例:某工作的贸易报表上展示成交总额涨跌情况,即正负 x%,x
    为主干数据类,调用的
    RPC
    服务,调用不成功时,返回的是默认值,页面显示:0%,这是不成立之,应该出示成中划
    线-。所以包装数据类型的 null
    值,能够代表额外的消息,如:远程调用失败,异常退出。
  3. 【强制】定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。
    反例:某工作的 DO 的 gmtCreate 默认值为 new
    Date();但是是特性在数码提取时并从未进
    入具体值,在创新任何字段时还要顺手更新了此字段,导致创建时间为改动成时日子。
    10.【强制】序列化类新增属性时,请不要改动 serialVersionUID
    字段,避免倒序列失败;如果
    意不配合升级,避免反序列化混乱,那么请修改 serialVersionUID 值。
    证明:注意 serialVersionUID 不一致会抛来序列化运行时很。
    11.【强制】构造方法里面禁止在另外事情逻辑,如果发生初始化逻辑,请在
    init 方法被。
    12.【强制】POJO 类必须写 toString 方法。使用工具类 source> generate
    toString 时,如果就
    承了另一个 POJO 类,注意在头里加一下 super.toString。
    证实:在艺术执行抛来特别时,可以直接调用 POJO 的
    toString()方法打印其属性值,便于排
    查问题。
  4. 【推荐】使用索引访问用 String 的 split
    方法得到的数组时,需开最后一个相间符后发无外 容的自我批评,否则会发生抛
    IndexOutOfBoundsException 的高风险。

阿里巴巴 JAVA 开发手册
8 / 32

说明:
String str = “a,b,c,,”; String[] ary = str.split(“,”); //预期大于
3,结果是 3 System.out.println(ary.length);
14.【推荐】当一个类产生差不多只构造方法,或者基本上只同名方法,这些方式应该以顺序放置于一道,便
于阅读。
15.【推荐】 类内方法定义顺序依次是:公有方法要保安措施 > 私有点子
> getter/setter 方
法。
说明:公有方法是看似的调用者和支持者最关切的道,首屏展示太好;保护方式则只是子类
关心,也可能是“模板设计模式”下之着力措施;而个人方法外部一般不待专门关爱,是一律
单黑盒实现;因为方法信息价值于逊色,所有 Service 和 DAO 的 getter/setter
方法在类体最
后。

  1. 【推荐】setter
    方法中,参数名称与类似成员变量名称相同,this.成员名=参数号称。在
    getter/setter 方法被,尽量不要多工作逻辑,增加排查问题难度。
    反例:
    public Integer getData(){ if(true) { return data + 100; } else { return
    data – 100; } } 17. 【推荐】循环体内,字符串的交接方式,使用
    StringBuilder 的 append 方法进行扩展。 反例:
    String str = “start”; for(int i=0; i<100; i++){ str = str + “hello”;
    } 说明:反编译出的许节码文件显示每次循环都见面 new 出一个 StringBuilder
    对象,然后进行
    append 操作,最后通过 toString 方法返回 String
    对象,造成内存资源浪费。
    18.【推荐】final 可增长程序响应效率,声明成 final 的动静:
    1) 不欲再次赋值的变量,包括类属性、局部变量。
    2) 对象参数前加 final,表示未容许修改引用的针对。
    3) 类方法确定无允让重写。
    19.【推荐】慎用 Object 的 clone 方法来拷贝对象。
    征:对象的 clone 方法默认是浅拷贝,若想实现深拷贝需要再写 clone
    方法实现属性对象的
    拷贝。
    阿里巴巴 JAVA 开发手册
    9 / 32

20.【推荐】类成员以及法访问控制从严:
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
方法,或者同一
只 public
的积极分子变量,删除一下,不得手心冒点汗吗?变量像自己之娃娃,尽量以和谐之观看
丝外,变量作用域太特别,如果任由界定的四面八方飞,那么您会担心之。
(五) 集合处理

  1. 【强制】Map/Set 的 key 为于定义对象时,必须还写 hashCode 和 equals。
    正例:String 重写了 hashCode 和 equals 方法,所以我们得老欣喜地利用
    String 对象作
    为 key 来使用。
  2. 【强制】ArrayList 的 subList 结果不可愈转成 ArrayList,否则会扔来
    ClassCastException 异常:java.util.RandomAccessSubList cannot be cast to
    java.util.ArrayList ;
    证:subList 返回的是 ArrayList 的中类 SubList,并无是 ArrayList
    ,而是 ArrayList
    的一个视图,对于 SubList 子列表的持有操作最终会反映至原列表上。
  3. 【强制】在 subList
    场景中,高度注意对原集合元素个数的改动,会导致子列表的遍历、增加、
    删除均发生 ConcurrentModificationException 异常。
  4. 【强制】使用集合转数组的法门,必须以集合的 toArray(T[]
    array),传入的是项目完全 一样的多次组,大小就 list.size()。
    反例:直接利用 toArray 无参方法存在问题,此措施返回值只能是
    Object[]类似,若高转其它
    种数组将面世 ClassCastException 错误。
    正例:
    List<String> list = new ArrayList<String>(2);
    list.add(“guan”); list.add(“bao”); String[] array = new
    String[list.size()]; array = list.toArray(array);
    阿里巴巴 JAVA 开发手册
    10 / 32

证明:使用 toArray 带参方法,入参分配的数组空间不足够充分时,toArray
方法中将重新分配
内存空间,并赶回新数组地址;如果反复组元素大于实际所欲,下标为[
list.size() ]的数组
素以给置为
null,其它数组元素保持原值,因此最好好用艺术可参数组大小定义和集合元素
个数一致。
5.
【强制】使用工具类Arrays.asList()把数组转换成集时,不克以其修改集合相关的方式,
它的 add/remove/clear 方法会抛来 UnsupportedOperationException 异常。
证实:asList 的返对象是一个 Arrays
内部类,并不曾实现集的修改章程。Arrays.asList
反映的是适配器模式,只是转换接口,后台的数目论是数组。
String[] str = new String[] { “a”, “b” };
List list = Arrays.asList(str);
首先栽状态:list.add(“c”); 运行时老。
其次种情况:str[0]= “gujin”; 那么 list.get(0)也会见跟着修改。

  1. 【强制】泛型通配符<? extends
    T>来收纳返回的数码,此写法的泛型集合不克运用 add 方法。
    征:苹果装箱后返一个<? extends
    Fruits>对象,此目标就是非能够向里加外水果,包括苹果
    果。
  2. 【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove
    元素请以 Iterator 方式,如果出现操作,需要针对 Iterator 对象加锁。
    反例:
    List<String> a = new ArrayList<String>(); a.add(“1”);
    a.add(“2”); for (String temp : a) { if(“1”.equals(temp)){
    a.remove(temp); } }
    证:这个事例的行结果碰头超出大家之预料,那么试一下管“1”换成“2”,会是同一的收尾
    果吗?
    正例:
    Iterator<String> it = a.iterator(); while(it.hasNext()){ String
    temp = it.next(); if(删除元素的条件){ it.remove(); } }
    阿里巴巴 JAVA 开发手册
    11 / 32

  3. 【强制】在 JDK7 版本以上,Comparator
    要满足自反性,传递性,对称性,不然 Arrays.sort,
    Collections.sort 会报 IllegalArgumentException 异常。
    说明:
    1) 自反性:x,y 的较结实跟 y,x 的于结实相反。
    2) 传递性:x>y,y>z,则 x>z。
    3) 对称性:x=y,则 x,z 比较结实和 y,z 比较结实一律。
    反例:下例中尚无拍卖等的情事,实际用被或者会见出现异常:
    new Comparator<Student>() { @Override public int compare(Student
    o1, Student o2) { return o1.getId() > o2.getId() ? 1 : -1; } } 9.
    【推荐】集合初始化时,尽量指定集合初始值大小。 说明:ArrayList 尽量利用
    ArrayList(int initialCapacity) 初始化。
    10.【推荐】使用 entrySet 总体历 Map 类集合 KV,而不是 keySet
    方式进行遍历。
    说明:keySet 其实是遍历了 2 次,一潮是转为 Iterator 对象,另一样不好是由
    hashMap 中取出 key
    所对应之 value。而 entrySet 只是遍历了平糟糕就是将 key 和 value 都加大至了
    entry 中,效率又
    高。如果是 JDK8,使用 Map.foreach 方法。
    正例:values()返回的凡 V 值集合,是一个 list 集合对象;keySet()返回的凡
    K 值集合,是
    一个 Set 集合对象;entrySet()返回的凡 K-V 值组合集合。
    11.【推荐】高度注意 Map 类集合 K/V 能不克积存 null
    值的情形,如下表:
    集合类 Key Value Super 说明
    Hashtable 不容许为 null 不容许吗 null Dictionary 线程安全
    ConcurrentHashMap 不允为 null 不允吗 null AbstractMap 线程局部安全
    TreeMap 不容许为 null 允许吗 null AbstractMap 线程不安全
    HashMap 允许为 null 允许吗 null AbstractMap 线程不安全
    反例:很多同室觉得 ConcurrentHashMap 是可以置入 null
    值。在批量翻现象中,子线程分
    发时,出现置入 null 值的气象,但主线程没有捕获到之十分,导致排查困难。
    12.【参考】合理利用好聚的有序性(sort)和平稳(order),避免集合的无序性(unsort)和无
    安居(unorder)带来的负面影响。
    阿里巴巴 JAVA 开发手册
    12 / 32

证实:稳定性指集每次遍历的元素次序是必定之。有序性是恃遍历的结果是本某种比较规则
次第排列的。如:ArrayList 是 order/unsort;HashMap 是
unorder/unsort;TreeSet 是
order/sort。
13.【参考】利用 Set
元素唯一的风味,可以高速对其余一个聚众进行去重操作,避免采取 List 的
contains 方法进行遍历去再操作。
(六) 并发处理
1.
【强制】获取单例对象要线程安全。在单例对象中做操作为使力保线程安全。
说明:资源驱动类、工具类、单例工厂类都待注意。
2.
【强制】线程资源要经过线程池提供,不同意在使被自行显式创建线程。
征:使用线程池的利益是减掉在创立同销毁线程上所花费的时光跟系统资源的开发,解决资
源不足的问题。如果非使用线程池,有或引致系统创造大气同类线程而导致消耗殆尽内存还是
“过度切换”的题材。

  1. 【强制】SimpleDateFormat 是线程不安全之类似,一般不要定义为 static
    变量,如果定义为 static,必须加锁,或者以 DateUtils 工具类。
    正例:注意线程安全,使用 DateUtils。亦推荐如下处理:
    private static final ThreadLocal<DateFormat> df = new
    ThreadLocal<DateFormat>() { @Override protected DateFormat
    initialValue() { return new SimpleDateFormat(“yyyy-MM-dd”); } };
    说明:如果是 JDK8 底行使,可以利用 instant 代替 Date,Localdatetime 代替
    Calendar,
    Datetimeformatter 代替 Simpledateformatter,官方给来之分解:simple
    beautiful strong
    immutable thread-safe。
    4.
    【强制】高并发时,同步调用应该去考量锁之属性损耗。能用无锁数据结构,就绝不为此锁;能
    锁区畈,就不要锁整个方法体;能因此对象锁,就不用用类锁。
    5.
    【强制】对大多个资源、数据库表、对象又加锁时,需要保持一致的加锁顺序,否则恐怕会见造
    成死锁。
    证:线程一需要对表 A、B、C
    依次全部加锁后才可以开展更新操作,那么线程二的加锁顺序
    啊亟须是 A、B、C,否则可能出现死锁。
    6.
    【强制】并发修改同一记录时,避免更新丢失,要么以应用层加锁,要么以缓存加锁,要么在
    多少库层使用乐观锁,使用 version 作为创新依据。
    阿里巴巴 JAVA 开发手册
    13 / 32

证实:如果每次访冲突概率小于
20%,推荐用乐观锁,否则用悲观锁。乐观锁的重试次
数不得小于 3 次。

  1. 【强制】多线程并行处理定时任务时,Timer 运行多个 TimeTask
    时,只要中有没有捕获 抛来之酷,其它任务便会自动停止运行,使用
    ScheduledExecutorService 则没是题目。
  2. 【强制】线程池不容许使用 Executors 去创造,而是经过
    ThreadPoolExecutor 的计,这样
    的处理方式让写的校友尤其肯定线程池的运行规则,规避资源耗尽的风险。
    征:Executors 各个艺术的坏处:
    1)newFixedThreadPool 和 newSingleThreadExecutor:
    主要问题是积的乞求处理队列可能会见吃非常酷之内存,甚至 OOM。
    2)newCachedThreadPool 和 newScheduledThreadPool:
    要害问题是线程数最大数凡是
    Integer.MAX_VALUE,可能会见创造数量大多之线程,甚至 OOM。

  3. 【强制】创建线程或丝程池时请指定出含义的线程名称,方便出错时回顾。
    正例:
    public class TimerTaskThread extends Thread { public TimerTaskThread(){
    super.setName(“TimerTaskThread”); … } 10.【推荐】使用 CountDownLatch
    进行异步转移同步操作,每个线程退出前要调用 countDown 方
    模仿,线程执行代码注意 catch 异常,确保 countDown
    方法好尽,避免主线程无法履行到
    countDown 方法,直到超时才回去结果。
    证:注意,子线程抛出怪堆栈,不能够以主线程 try-catch 到。
    11.【推荐】避免 Random
    实例被多线程使用,虽然共享该实例是线程安全之,但会为竞争同一 seed
    致使的属性降低。
    证实:Random 实例包括 java.util.Random 的实例或者 Math.random()实例。
    正例:在 JDK7 自此,可以一直下 API ThreadLocalRandom,在 JDK7
    之前,可以完成每个线
    路一个实例。

  4. 【推荐】通过重复检查锁(double-checked
    locking)(在出现场景)实现延迟初始化的优化 问题隐患(可参考 The
    “Double-Checked Locking is Broken” Declaration),推荐问题解决方
    案中较为简单一栽(适用于 jdk5 同以上版本),将对象属性声明也 volatile
    型(比如反例
    蒙修改 helper 的特性声明也 private volatile Helper helper = null;);
    反例:
    class Foo { private Helper helper = null; public Helper getHelper() {
    阿里巴巴 JAVA 开发手册
    14 / 32

if (helper == null) synchronized(this) { if (helper == null) helper =
new Helper(); } return helper; } // other functions and members…
} 13.【参考】volatile
解决多线程内存不可见问题。对于同描写多读,是得化解变量同步问题,
可要多写,同样无法化解线程安全题材。如果想抱回
count++数据,使用如下类实现:
AtomicInteger count = new AtomicInteger(); count.addAndGet(1);
count++操作而是
JDK8,推荐使用 LongAdder 对象,比 AtomicLong
性能再次好(减少乐观锁的重试次数)。
14.【参考】注意 HashMap 的扩容死链,导致 CPU 飙升的题目。
15.【参考】ThreadLocal无法解决共享对象的翻新问题,ThreadLocal对象建议用static修饰。
其一变量是针对一个线程内有着操作共有的,所以设置为静态变量,所有此类实例共享此静态
变量
,也就是说在看似第一破受采取时装载,只分红一片存储空间,所有此类的目标(只要是当下
单线程内定义之)都得操控这个变量。
(七) 控制语句

  1. 【强制】在一个 switch 块内,每个 case 要么通过 break/return
    来歇,要么注释说明程序 将继续执行到啊一个 case 为止;在一个 switch
    块内,都必带有一个 default 语句子以位居
    说到底,即使其什么代码也绝非。
  2. 【强制】在 if/else/for/while/do
    语句子被要以大括哀号,即使单独生一行代码,避免采取下 面的花样:if
    (condition) statements;
  3. 【推荐】推荐尽量少用 else, if-else 的法门可改写成:
    if(condition){ … return obj; } // 接着写 else 的政工逻辑代码;
    说明:如果使用如 if-else if-else 方式发挥逻辑,【强制】请不超过 3
    层,超过请动状态
    设计模式。
  4. 【推荐】除常用方法(如
    getXxx/isXxx)等他,不要在标准判断中执复杂的言语,以加强 可读性。
    正例:
    //伪代码如下 InputStream stream = file.open(fileName, “w”);
    阿里巴巴 JAVA 开发手册
    15 / 32

if (stream != null) { … } 反例:
if (file.open(fileName, “w”) != null)) { … } 5.
【推荐】循环体中的语如果勘验性能,以下操作尽量移至循环体外处理,如定义对象、变量、
获取数据库连接,进行无必要之 try-catch 操作(这个 try-catch
是否足以变至循环体外)。

  1. 【推荐】接口入参保护,这种景象常见的凡用来做批量操作的接口。
  2. 【参考】方法吃得进行参数校验的景:
    1) 调用频次低的法门。
    2)
    执行时间支出很特别的方,参数校验时间几乎可忽略不计,但如果因为参数错误导致
    中档执行回退,或者失实,那得不偿失。
    3) 需要极度高稳定与可用性的不二法门。
    4) 对外提供的开放接口,不管是 RPC/API/HTTP 接口。
  3. 【参考】方法中不需要参数校验的现象:
    1)
    极有或受循环调用的章程,不建议针对参数进行校验。但当艺术求证里总得注明外部参
    数检查。
    2)
    底层的计调用频度都比高,一般不校验。毕竟是如纯净和滤的结尾一志,参数错
    无意不太可能到脚才见面暴露问题。一般 DAO 层与 Service
    层都于与一个应用被,部署在同一台
    服务器被,所以 DAO 的参数校验,可以简单。
    3) 被声称成 private
    只见面让自己代码所调用的章程,如果能规定调用方法的代码传入参
    频一度开过检查或者自然不会见产生题目,此时得不校验参数。
    (八) 注释规约
  4. 【强制】类、类特性、类措施的注解必须运用 javadoc
    规范,使用/**内容*/格式,不得采取 //xxx 方式。
    说明:在 IDE 编辑窗口被,javadoc 方式会唤起相关注释,生成 javadoc
    可以对输出相应注
    放活;在 IDE
    中,工程调用方法时,不上方式即可上浮提示方法、参数、返回值的义,提高
    翻阅效率。
  5. 【强制】所有的空洞方法(包括接口中之章程)必须要为此 javadoc
    注释、除了回到值、参数、
    雅说明他,还必须指出该方法做啊业务,实现啊功效。
    说明:如发落实和调用注意事项,请一连证实。
    阿里巴巴 JAVA 开发手册
    16 / 32

  6. 【强制】所有的切近都必须抬高创建者信息。
    4.
    【强制】方法中单行注释,在叫诠释语句上方另起一行,使用//注释。方法中多行注释使
    用/* */注释,注意与代码对伙同。

  7. 【强制】所有的枚举类型字段必须使来注释,说明每个数据项的用。
    6.
    【推荐】与那“半吊子”英文来诠释,不如用汉语注释把题目说知道。专有名词、关键字,保
    持英文原文即可。
    反例:“TCP 连接超时”解释成“传输控制协议连接超时”,理解反而费脑筋。
    7.
    【推荐】代码修改的同时,注释也如进行对应的改动,尤其是参数、返回值、异常、核心逻辑
    等之改。
    证明:代码和注释更新不联合,就像路网和导航软件更新不齐同,如果导航软件严重退化,
    不畏错过了导航的含义。
  8. 【参考】注释掉的代码尽量使配合征,而未是概括的注释掉。
    说明:代码被诠释掉发半点栽可能:1)后续会东山再起这个段子代码逻辑。2)永久非用。前者如果没有
    发备注信息,难以明白注释动机。后者建议直接删掉(代码仓库保存了史代码)。
    9.
    【参考】对于注释的求:第一、能够规范反应设计思想和代码逻辑;第二、能够描述业务含
    义,使别的程序员能够很快了解及代码背后的音信。完全没有注释的大段代码对于阅读者形同
    天书,注释是吃好扣的,即使相隔好丰富时,也克清楚明了当下的思路;注释也是受后人看
    的,使其会迅速接替自己之办事。
    10.
    【参考】好之命名、代码结构是由说的,注释力求言简意赅准确、表达完。避免出现注释的一样
    只极端:过多过滥的注解,代码的逻辑一旦修改,修改注释是相当可怜的背。
    反例:
    // put elephant into fridge put(elephant, fridge); 方法名
    put,加上两个发意义之变量名 elephant 和
    fridge,已经证明了当时是于关系啊,
    语义清晰的代码不欲格外的笺注。
    11.【参考】特殊注释标记,请注明标记人同标记时间。注意及时处理这些标记,通过标志扫描,
    经常清理此类标记。线达故障有时候就算来源于这些标记处的代码。
    1) 待办事宜(TODO):( 标记人,标记时间,[预测处理时])
    意味着需贯彻,但时还免实现的职能。这事实上是一个 javadoc
    的竹签,目前底
    javadoc
    还并未实现,但曾给普遍运用。只能动用于类,接口及道(因为它们是一个
    javadoc
    标签)。
    阿里巴巴 JAVA 开发手册
    17 / 32

2) 错误,不可知办事(FIXME):(标记人,标记时间,[前瞻处理时])
在诠释中因故 FIXME
标记之一代码是一无是处的,而且未克干活,需要及时纠正之情形。

(九) 其它
1.
【强制】在应用正则表达式时,利用好该预编译功能,可以中加快正则匹配速度。
说明:不要当章程体内定义:Pattern pattern = Pattern.compile(规则);

  1. 【强制】避免用 Apache Beanutils 进行性能的 copy。 说明:Apache
    BeanUtils 性能比较差,可以行使另外方案以 Spring BeanUtils, Cglib
    BeanCopier。
  2. 【强制】velocity 调用 POJO
    类的特性时,建议直接使用属性名取值即可,模板引擎会活动按 规范调用 POJO
    的 getXxx(),如果是 boolean 基本数据列变量(注意,boolean 命名不欲
    加 is 前缀),会自动调用 isXxx()方法。
    征:注意要是 Boolean 包装类对象,优先调用 getXxx()的法子。
  3. 【强制】后令输送给页面的变量必须加$!{var}——中间的感叹号。 说明:如果
    var=null 或者未存,那么${var}会一直展示在页面上。
  4. 【强制】注意 Math.random() 这个措施返回是 double 类型,注意取值范围
    0≤x<1(能够取
    到零值,注意除散装特别),如果想赢得整数类型的妄动数,不要以 x 放大 10
    的多少倍然后取
    理,直接运用 Random 对象的 nextInt 或者 nextLong 方法。
  5. 【强制】获取当前毫秒数:System.currentTimeMillis(); 而非是 new
    Date().getTime(); 说明:如果想得更规范的纳秒级时间价值,用
    System.nanoTime。在 JDK8 中,针对统计时
    个中等景象,推荐使用 Instant 类。
  6. 【推荐】尽量不要以 vm 中投入变量声明、逻辑运算符,更不用当 vm
    模板被入其他复杂的逻 辑。
  7. 【推荐】任何数据结构的应用都答应限制大小。
    说明:这点特别不便了做到,但十分频繁之故障都是因数量结构于增长,结果造成内存为吃就。

9.
【推荐】对于“明确停止使用的代码和配置”,如方法、变量、类、配置文件、动态配置属性
等而坚定不移打程序中清理出去,避免造成过多垃圾。清理这类似垃圾代码是技术气场,不要生如此
的传统:“不举行正确,多举行多擦”。

阿里巴巴 JAVA 开发手册
18 / 32

仲、异常日志
(一) 异常处理

  1. 【强制】不要捕获 Java 类库中定义之存续自 RuntimeException
    的运作时非常类,如:
    IndexOutOfBoundsException /
    NullPointerException,这类似非常由程序员预检查来逃避,保
    证程序健壮性。
    正例:if(obj != null) {…}
    反例:try { obj.method() } catch(NullPointerException e){…}
    2.
    【强制】异常不要就此来做流程控制,条件决定,因为好的拍卖效率比较准划分支低。
  2. 【强制】对大段代码进行 try-catch,这是不负责任的见。catch
    时请分清稳定代码和非稳
    定代码,稳定代码指的凡无论如何不会见错的代码。对于未稳定代码的 catch
    尽可能进行区分
    酷类型,再开相应的雅处理。
    4.
    【强制】捕获异常是为了处理它,不要捕获了可什么还未处理要抛开的,如果不思量处理它,请
    拿欠生抛给其的调用者。最外层的工作使用者,必须处理非常,将那个转化为用户可理解的
    内容。
  3. 【强制】有 try 块放到了政工代码中,catch
    异常后,如果要回滚事务,一定要留意手动回 滚事务。
  4. 【强制】finally 块必须对资源对象、流对象进行关闭,有充分与否要是召开
    try-catch。 说明:如果 JDK7,可以动用 try-with-resources 方法。
  5. 【强制】不可知在 finally 块中采取 return,finally 块中之 return
    返回后措施了执行,不 会再实施 try 块中之 return 语句。
    8.
    【强制】捕获异常及抛大,必须是截然匹配,或者捕获异常是废除大的父类。
    说明:如果预想抛的是绣球,实际收到的凡铅球,就见面发生意想不到状况。
  6. 【推荐】方法的返回值可以呢
    null,不愈制返回空集合,或者空对象等,必须加加注充分
    说明什么动静下会回到 null 值。调用方需要开展 null 判断防止 NPE 问题。
    说明:本规约明确防止 NPE
    是调用者的责任。即使受调用方法返回空集合或者空对象,对调用
    啊来说,也毫无高枕无忧,必须考虑到长途调用失败,运行时十分等状况返回
    null 的情景。
    10.【推荐】防止 NPE,是程序员的中心修养,注意 NPE 产生的观:
    1) 返回路为包装数据类型,有或是 null,返回 int 值时留意判空。
    阿里巴巴 JAVA 开发手册
    19 / 32

反例:public int f(){ return Integer 对象},如果为 null,自动解箱抛
NPE。
2) 数据库的查询结果可能也 null。
3) 集合里的元素即 isNotEmpty,取有之数目元素也说不定啊 null。
4) 远程调用返回对象,一律要求开展 NPE 判断。
5) 对于 Session 中取得之数据,建议 NPE 检查,避免空指针。
6) 级联调用 obj.getA().getB().getC();一连串调用,易发生 NPE。
11.【推荐】在代码中以“抛大”还是“返回错误码”,对于商家外的 http/api
开放接口必
必须动用“错误码”;而动中推荐生抛来;跨应用内 RPC 调用优先考虑以
Result 方式,
封装 isSuccess、“错误码”、“错误简短信息”。
证明:关于 RPC 方法返回方式利用 Result 方式的理:
1)使用抛大返回方式,调用方如果没捕获到就是见面出运行时左。
2)如果不加以库信息,只是 new 自定义格外,加入自己之理解的 error
message,对于调用
掬解决问题的援助不见面尽多。如果加了储藏室信息,在频繁调用出错的状下,数据序列化和导
的特性损耗也是题材。
12.【推荐】定义时区分 unchecked / checked 异常,避免直接采用
RuntimeException 抛来,更
未容许抛来 Exception 或者
Throwable,应使用产生业务含义的自定义异常。推荐业界已定义了
的自定义异常,如:DaoException / ServiceException 等。
13.【参考】避免出现重复的代码(Don’t Repeat Yourself),即 DRY 原则。
证:随意复制与糊代码,必然会造成代码的再,在随后得改时,需要修改所有的适合
本,容易遗漏。必要时抽取共性方法,或者抽象公共类,甚至是合用模块。
正例:一个近乎中生出多独 public
方法,都用开展数行相同之参数校验操作,这个时节要抽取:
private boolean checkParam(DTO dto){…} (二) 日志规约

  1. 【强制】应用被不可直接利用日志系统(Log4j、Logback)中的
    API,而应指使用日志框架 SLF4J 中之
    API,使用门面模式的日志框架,有利于保障及各个类的日记处理方式统一。
    import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static
    final Logger logger = LoggerFactory.getLogger(Abc.class); 2.
    【强制】日志文件推荐至少保存 15
    天,因为有点大具备为“周”为频次发生的风味。
  2. 【强制】应用被的恢宏日志(如打点、临时监控、访问日志当)命名方式:
    appName_logType_logName.log。logType:日志类型,推荐分类有
    stats/desc/monitor/visit
    相当于;logName:日志描述。这种命名的益处:通过文件称就是只是理解日记文件属于什么使,什么
    阿里巴巴 JAVA 开发手册
    20 / 32

列,什么目的,也有益于归类查找。
正例:mppserver 应用中独监控时区转换异常,如:
mppserver_monitor_timeZoneConvert.log
证:推荐对日记进行归类,错误日志与事情日志尽量分开存放,便于开发人员查看,也方便
经过日记对系开展当下督查。

  1. 【强制】对 trace/debug/info
    级别之日记输出,必须采取规则输出形式要以占位符的方 式。
    说明:logger.debug(“Processing trade with id: ” + id + ” symbol: ” +
    symbol); 如果
    日志级别是 warn,上述日志不见面打印,但是会尽字符串拼接操作,如果 symbol
    是目标,会
    实施
    toString()方法,浪费了系统资源,执行了上述操作,最终日志也无打印。
    正例:(条件)
    if (logger.isDebugEnabled()) { logger.debug(“Processing trade with id: “
  2. id + ” symbol: ” + symbol); } 正例:(占位符)
    logger.debug(“Processing trade with id: {} and symbol : {} “, id,
    symbol); 5. 【强制】避免重新打印日志,浪费磁盘空间,务必在 log4j.xml
    中设置 additivity=false。 正例:<logger
    name=”com.taobao.ecrm.member.config” additivity=”false”> 6.
    【强制】异常信息应该包括个别近似消息:案发现场信息与深堆栈信息。如果非处理,那么为上
    抛。
    正例:logger.error(各类参数或者目标 toString + “_” + e.getMessage(),
    e);
  3. 出口的 POJO 类必须再次写 toString 方法,否则才输出此目标的 hashCode
    值(地址值),没啥 参考意义。
  4. 【推荐】可以使 warn
    日志级别来记录用户输入参数错误的状况,避免用户投诉时,无所适
    自从。注意日志输出的级别,error
    级别只记录系统逻辑出错、异常、或者根本之错误信息。如
    非必不可少,请不要以斯景打来 error 级别,避免频繁报警。
  5. 【推荐】谨慎地记下日志。生产条件禁止出口 debug 日志;有选择地出口
    info 日志;如果只要 用 warn
    来记录刚上线时的事务行为信息,一定要是留意日志输出量的题目,避免将服务器磁盘
    撑爆,并记及时删除这些观测日志。
    征:大量地出口无效日志,不便民系统特性提升,也无便民快速稳定错误点。纪录日志时请
    想想:这些日记真的有人看呢?看到就漫长日志你会做呀?能免可知被问题排查带来益处?
    10.【参考】如果日志用英文描述不知晓,推荐使用中文注释。对于华语 UTF-8
    的日志,在 secureCRT
    遭到,set
    encoding=utf-8;如果中文字符还乱码,请设置:全局>默认的对话设置>外观>字体>
    阿里巴巴 JAVA 开发手册
    21 / 32

选取字符集 gb2312;如果还挺,执行命令:set
termencoding=gbk,并且一直动用中文来
拓展检索。
三、MYSQL 规约
(一) 建表规约

  1. 【强制】表达是吧概念的字段,必须动 is_xxx 的不二法门命名,数据类型是
    unsigned tinyint ( 1 表示是,0 表示为),此规则一样适用于 odps 建表。
    说明:任何字段如果为非负数,必须是 unsigned。
    2.
    【强制】表名、字段名必须使小写字母或数字;禁止出现数字开,禁止个别只下划线中间就
    出现数字。数据库字段名的修改代价十分充分,因为无法进行先期披露,所以字段名称需要慎重考虑。
    正例:getter_admin,task_config,level3_name
    反例:GetterAdmin,taskConfig,level_3_name
  2. 【强制】表名不利用复数名词。
    证:表名应该只有表示表里面的实体内容,不应该代表实体数量,对诺被 DO
    类名也是单数
    款式,符合表达习惯。
  3. 【强制】禁用保留字,如 desc、range、match、delayed
    等,参考官方保留字。
  4. 【强制】唯一索引名为 uk_许段名;普通索引名则为 idx_字段名。
    说明:uk_ 即 unique key;idx_ 即 index 的简称。
  5. 【强制】小数类型也 decimal,禁止使用 float 和 double。
    证明:float 和 double
    在囤的时,存在精度损失的题材,很可能在值的于时,得到非
    科学的结果。如果存储的数额范围超 decimal
    的限量,建议用数据拆成整数和小数分开储存。

  6. 【强制】如果存储的字符串长度几乎等于,使用 CHAR 定长字符串类型。

  7. 【强制】varchar 是不过变换长字符串,不事先先分配存储空间,长度不要过
    5000,如果存储长度
    出乎此值,定义字段类型也
    TEXT,独立出来一摆表,用主键来对号入座,避免影响其它字段索引
    效率。
  8. 【强制】表必备三许段:id, gmt_create, gmt_modified。 说明:其中 id
    必为主键,类型也 unsigned bigint、单表时自增、步长为 1;分表时移吧打
    TDDL Sequence 取值,确保分表之间的全局唯一。gmt_create, gmt_modified
    的花色均为
    date_time 类型。
    阿里巴巴 JAVA 开发手册
    22 / 32

10.【推荐】表底命名最好是加上“业务名称_发明底意向”,避免上云梯后,再与另业务表关联
时有混淆。
正例:tiger_task / tiger_reader / mpp_config
11.【推荐】库名与下名称尽量一致。
12.【推荐】如果改动字段含义或对字段表示的状态多时,需要及时更新字段注释。
13.【推荐】字段允许适当冗余,以增长性,但是得考虑数据并的景象。冗余字段应以:

1)不是累修改的字段。
2)不是 varchar 超长字段,更不克是 text 字段。
正例:各业务线经常冗余存储商品名称,避免查询时需要调用 IC 服务得。
14.【推荐】单表行数超过 500 万行或者单表容量超过
2GB,才推荐进行分库分表。
说明:如果预测三年后的数据量根本达不顶这级别,请不要当创立表时就算分库分表。
反例:某工作三年总和据量才 2 万执行,却分成 1024
张表,问:你怎么这样设计?答:分 1024
张表,不是标配吗?
15.【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更要之是升格查找
速度。
正例:人之年纪用 unsigned tinyint(表示范围 0-255,人的寿命不会见跨 255
岁);海龟就
非得是 smallint,但若是是太阳的岁,就必是
int;如果是拥有恒星的齿都加以起来,那
也就亟须采取 bigint。
(二) 索引规约
1.
【强制】业务达到具备唯一特点的字段,即使是构成字段,也亟须建成唯一索引。
说明:不要认为唯一索引影响了 insert
速度,这个速度损耗可以忽略,但加强查找速度是知道
发的;另外,即使以应用层做了挺全面的校验和决定,只要没有唯一索引,根据墨菲定律,
早晚有水污染数据来。

  1. 【强制】超过三只表禁止 join。需要 join
    的字段,数据类型保持绝对相同;多表关联查询时,
    保证为提到的字段需要出目录。
    征:即使双表 join 也要是注意表索引、SQL 性能。
  2. 【强制】在 varchar
    字段上建立目录时,必须指定索引长度,没必要对都配段建立目录,根据
    实际文本区分度决定索引长度。
    说明:索引的尺寸以及区分度是相同对矛盾体,一般对字符串类型数据,长度为 20
    的目录,区分
    阿里巴巴 JAVA 开发手册
    23 / 32

度过会面高及 90%之上,可以用 count(distinct left(列名,
索引长度))/count(*)的区分度来
确定。

  1. 【强制】页面搜索严禁左模糊或者都模糊,如果用请动搜索引擎来化解。
    证明:索引文件具有 B-Tree
    的尽荒唐前方缀匹配特性,如果左边的价不规定,那么无法使用此索
    引。
  2. 【推荐】如果发 order by 的场面,请小心使用索引的有序性。order by
    最后的字段是做索 引的一律有些,并且位居索引组合顺序的结尾,避免出现
    file_sort 的动静,影响查询性能。
    正例:where a=? and b=? order by c; 索引:a_b_c
    反例:索引中产生限量查找,那么索引有序性无法用,如:WHERE a>10 ORDER
    BY b; 索引 a_b
    无法排序。
  3. 【推荐】利用覆盖索引来进行询问操作,来避免回表操作。
    说明:如果一致本书要懂得第 11 章是呀标题,会翻动第 11
    章对应之那同样页为?目录浏览一
    产就是好,这个目录就是自从至掩索引的意向。
    正例:IDB
    能够起目录的种:主键索引、唯一索引、普通索引,而覆盖索引是千篇一律栽查询的
    平等种植效应,用 explain 的结果,extra 列会油然而生:using index.
  4. 【推荐】利用延迟关联或者子查询优化超多分页场景。 说明:MySQL
    并无是越了 offset 行,而是取 offset+N 行,然后返回放弃前 offset 行,返回
    N
    实践,那当 offset
    特别坏之上,效率就是怪的垂,要么控制返回的总页数,要么对超过特
    定阈值的页数进行 SQL 改写。
    正例:先飞稳定要取得的 id 段,然后再度干: SELECT a.* FROM 表 1 a,
    (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id
  5. 【推荐】 SQL 性能优化的靶子:至少要高达 range 级别,要求凡 ref
    级别,如果得以是 consts 最好。
    说明:
    1)consts
    单表中极其多特发一个匹配配行(主键或者唯一索引),在优化等即可读博到数码。
    2)ref 指的是用普通的目。(normal index)
    3)range 对索引进范围检索。
    反例:explain 表的结果,type=index,索引物理文件均扫描,速度杀缓慢,这个
    index 级别
    于 range 还不如,与全表扫描是小巫见大巫。
  6. 【推荐】建组合索引的时刻,区分度最高的于最为左边。 正例:如果 where a=?
    and b=? ,a 列的几接近于唯一值,那么单纯需要单建 idx_a 索引即可。
    阿里巴巴 JAVA 开发手册
    24 / 32

证:存在非等号和齐号混合判断标准时,在建索引时,请把等号规则的列前置。如:where
a>?
and b=? 那么就是 a 的区分度更胜,也务必将 b 放在索引的最好前列。
10.【参考】创建索引时避免有如下极端误解:
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)),0,SUM(g)) FROM
    table;
  4. 【强制】使用 ISNULL()来判断是否也 NULL 值。注意:NULL
    与任何值的直白比较还为 NULL。
    说明:
    1) NULL<>NULL 的归结果是 NULL,不是 false。
    2) NULL=NULL 的回到结果是 NULL,不是 true。
    3) NULL<>1 的返结果是 NULL,而不是 true。
  5. 【强制】在代码中描写分页查询逻辑时,若 count 也 0
    应直接回,避免执行后的分页语句。

  6. 【强制】不得采用外键与级联,一切外键概念必须在应用层解决。
    说明:(概念解释)学生表中的 student_id 是主键,那么成绩表中的
    student_id 则为外键。
    假定更新学生表中的 student_id,同时触发成绩表中的 student_id
    更新,则也级联更新。外
    键和级联更新适用于仅机低并发,不符合分布式、高并发集群;级联更新是强阻塞,存在多少
    库房更新风暴的高风险;外键影响数据库的插入速度。

  7. 【强制】禁止采取存储过程,存储过程难调试和扩充,更没移植性。
    阿里巴巴 JAVA 开发手册
    25 / 32

  8. 【强制】IDB 数据订正时,删除和改动记录时,要先期
    select,避免出现误删除,确认无误才会 提交实施。

  9. 【推荐】in 操作会幸免则免,若实以避免不了,需要细评估 in
    后止的集合元素数量,控 制在 1000 个以内。
    10.【参考】因阿里巴巴全球化需要,所有的字符存储和代表,均以 utf-8
    编码,那么字符计数方
    法注意:
    说明:
    SELECT LENGTH(“阿里巴巴”); 返回吗 12
    SELECT CHARACTER_LENGTH(“阿里巴巴”); 返回吗 4
    若是假定用表情,那么以 utfmb4 来进展仓储,注意其和 utf-8 编码。
    11.【参考】TRUNCATE TABLE 比 DELETE
    速度快,且使的网和工作日志资源少,但 TRUNCATE
    随便业务都不触发
    trigger,有或致事故,故不建议以开代码中采取是语。
    证明:TRUNCATE TABLE 在效益及以及非带来 WHERE 子句之 DELETE 语词相同。
    (四) ORM 规约
  10. 【强制】在表查询中,一律不要以 *
    作为查询的字段列表,需要哪些字段必须明确写明。
    说明:1)增加查询分析器解析成本。2)增减配段容易和 resultMap
    配置不同等。
  11. 【强制】POJO 类的 boolean 属性不能够加 is,而数据库字段必须加
    is_,要求在 resultMap 中
    开展字段与性能之间的投射。
    征:参见定义 POJO 类以及数据库字段定义规定,在 sql.xml
    增加映射,是须的。
  12. 【强制】不要为此 resultClass
    当返回参数,即使拥有类属性名与数据库字段一一对应,也需要
    定义;反过来,每一个阐明也一定产生一个和之对应。
    说明:配置映射关系,使字段与 DO 类解耦,方便维护。
  13. 【强制】xml 配置中参数注意使用:#{},#param# 不要动${}
    此种方式易并发 SQL 注入。
  14. 【强制】iBATIS 自带的 queryForList(String statementName,int start,int
    size)不推荐而 用。
    证实:其促成方式是在数据库取到 statementName 对应之 SQL
    语句之享有记录,再经 subList
    取 start,size 的子集合,线达以这个缘故都出现过 OOM。

阿里巴巴 JAVA 开发手册
26 / 32

正例:在 sqlmap.xml 中引入 #start#, #size#
Map<String, Object> map = new HashMap<String, Object>();
map.put(“start”, start); map.put(“size”, size); 6. 【强制】不允直接以
HashMap 与 HashTable 作为查询结果集的出口。
反例:某同学为免写一个<resultMap>,直接使用 HashTable
来接收数据库返回结果,结果
并发日常是将 bigint 转成为 Long 值,而线达由于数据库版本不均等,解析成
BigInteger,导
致线上问题。

  1. 【强制】更新数据表记录时,必须同时更新记录对应之 gmt_modified
    字段值为眼前岁月。
  2. 【推荐】不要写一个颇而备的数量更新接口,传入为 POJO
    类,不管是休是友善之对象更新字 段,都进行 update table set
    c1=value1,c2=value2,c3=value3; 这是畸形的。执行 SQL 时,
    尽可能不要更新无改变的字段,一是爱出错;二凡是效率不如;三凡是 binlog
    增加存储。
  3. 【参考】@Transactional 事务不要滥用。事务会影响数据库的
    QPS,另外利用工作之地方要
    考虑各面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等。
    10.【参考】<isEqual>中的 compareValue
    是跟属于性值对比的常量,一般是数字,表示相当时带达
    以此条件;<isNotEmpty>表示不也空且不呢 null
    时实施;<isNotNull>表示不为 null 值时实行。
    季、工程则
    (一) 应用分层
    1.
    【推荐】图备受默认上层依赖让下层,箭头关系表示可直接依赖,如:开放接口层可以凭借让
    Web 层,也可一直依赖让 Service 层,依此类推:

阿里巴巴 JAVA 开发手册
27 / 32

 开放接口层:可一直封装 Service 接口暴露成 RPC 接口;通过 Web 封装成
http 接口;网关控
制层等。
 终端显示层:各个端的模版渲染并实行显示层。当前首要是 velocity 渲染,JS
渲染,JSP 渲
污染,移动端展示层等。
 Web
层:主要是本着访问控制进行转向,各类基本参数校验,或者无复用的事体简单处理等。
 Service 层:相对具体的政工逻辑服务层。
 Manager 层:通用业务处理层,它产生如下特征:
1) 对第三着平台封装的重合,预处理回来结果以及转账异常信息;
2) 对 Service 层通用能力的下移,如缓存方案、中间件通用处理;
3) 与 DAO 层交互,对 DAO 的业务通用能力的卷入。
 DAO 层:数据访问层,与底层 Mysql、Oracle、Hbase、OB 进行多少交互。
 外部接口或第三方平台:包括外单位 RPC 开放接口,基础平台,其它企业之
HTTP 接口。

  1. 【参考】(分层异常处理规约)在 DAO
    层,产生的不可开交类型有为数不少,无法用细粒度异常进行 catch,使用
    catch(Exception e)方式,并 throw new DaoException(e),不待打印日志,
    因为日志在 Manager/Service
    层一定得捕获并打到日志文件中去,如果并服务器再从日志,
    浪费性能与储存。在 Service
    层出现异常时,必须记录日志信息及磁盘,尽可能带齐参数信息,
    一定给维护案发现场。如果 Manager 层与 Service 同机部署,日志方式与 DAO
    层处理同,如
    果是单独安排,则采取与 Service 一致的处理方式。Web
    层绝不应该继续向上扔大,因为早已
    经处顶层,无后续处理好的点子,如果发现及之深将造成页面无法正常渲染,那么就
    有道是一直跨越反至祥和错误页面,尽量加上自己的一无是处提示信息。开放接口层要用异常处理成错
    误码和错误信息方式回。
  2. 【参考】分层领域模型规约:
     DO(Data Object):与数库表结构一一对应,通过 DAO
    层向上传输数据源对象。
     DTO(Data Transfer Object):数据传对象,Service 和 Manager
    向他传输的靶子。
     BO(Business Object):业务对象。可以由 Service
    层输出的卷入业务逻辑的目标。
     QUERY:数据查询对象,各层接收上层的查询请求。注:超过 2
    个参数的询问封装,禁止如
    因此 Map 类来导。
     VO(View Object):显示层对象,通常是 Web
    向模板渲染引擎层传输的目标。

阿里巴巴 JAVA 开发手册
28 / 32

(二) 二方库规约

  1. 【强制】定义 GAV 遵从以下规则: 1) GroupID 格式:com.{公司/BU
    }.业务线.[子业务线],最多 4 级。
    证:{公司/BU} 例如:alibaba/taobao/tmall/aliexpress 等 BU
    一级;子业务线可选。
    正例:com.taobao.tddl 或 com.alibaba.sourcing.multilang
    2) ArtifactID
    格式:产品线名-模片名。语义不重不遗漏,先到仓库中心去调研一下。
    正例:tc-client / uic-api / tair-tool
    3) Version:详细规定参考下方。
  2. 【强制】二方库版本号命名方式:主版本号.次版本号.修订号
    1) 主版本号:当做了非匹配的 API
    修改,或者增加了力所能及更改产品趋势的新职能。
    2) 次版本号:当做了向下兼容的功能性新增(新增类、接口等)。
    3) 修订号:修复 bug,没有改动章程签名的功用增强,保持 API 兼容性。
  3. 【强制】线达用不要借助 SNAPSHOT
    版本(安全保管除外);正式披露之类库必须使用 RELEASE 版本号升级+1
    的措施,且版本号不允许覆盖升级,必须去中央仓库进行调研。
    证实:不依赖 SNAPSHOT
    版本是保证应用发布的幂等性。另外,也得以加快编译时之打包构建。
  4. 【强制】二方库的新增或提升,保持除功能点以外的旁 jar
    包仲裁结果莫更换。如果生改观, 必须明确评估以及证明,建议开展
    dependency:resolve 前后信息比对,如果仲裁结果了无均等
    赋予,那么通过 dependency:tree 命令,找出差异点,进行<excludes>排除
    jar 包。
    5.
    【强制】二方库里可定义枚举类型,参数可以使枚举类型,但是接口返回值不同意行使枚
    举类型或者隐含枚举类型的 POJO 对象。
    6.
    【强制】依赖让一个二方库群时,必须定义一个统一版本变量,避免版本号不一致。
    说明:依赖
    springframework-core,-context,-beans,它们还是暨一个版,可以定义一个
    变量来保存版本:${spring.version},定义依赖的当儿,引用该版。
  5. 【强制】禁止在子项目的 pom 依赖中出现同样之 GroupId,相同的
    ArtifactId,但是差之 Version。
    证:在本土调试时见面以各子项目指定的版本号,但是合并成一个
    war,只能发出一个本号
    并发在末的 lib
    目录中。曾经出现了线下调试是不错的,发布到线及发出故障的先河。
  6. 【推荐】工具类二方库已经提供的,尽量不要以以以被编程实现。
     json 操作: fastjson
    阿里巴巴 JAVA 开发手册
    29 / 32

 md5 操作:commons-codec
 工具集:Guava 包
 数组操作:ArrayUtils(org.apache.commons.lang3.ArrayUtils)

集合操作:CollectionUtils(org.apache.commons.collections4.CollectionUtils)
 除上面以外还有 NumberUtils、DateFormatUtils、DateUtils 等优先采取
org.apache.commons.lang3 这个包下的,不要使用 org.apache.commons.lang
包下面
的。原因是 commons.lang 这个保险是由 JDK1.2 开始支持之故广大 1.5/1.6
的风味是勿
支持的,例如:泛型。

  1. 【推荐】所有 pom
    文件被之负声明在<dependencies>语句子块被,所有版本仲裁放在
    <dependencyManagement>语句块被。
    证明:<dependencyManagement>里独自是宣称版本,并无兑现引入,因此子项目用显式的声明
    依靠,version和scope都念博自父pom。而
    <dependencies>所有宣称在主pom的<dependencies >
    里的乘还见面活动引入,并默认为所有的子项目继承。
    10.【推荐】二方库尽量不要发生安排起,最低限度不要再次增加部署起。
    11.【参考】为避以二方库的倚重冲突问题,二方库发布者应当依以下标准:
    1)精简可控条件。移除一切不必要的 API 和依赖,只包含 Service
    API、必要之圈子模型对
    象、Utils 类、常量、枚举等。如果因其它二方库,尽量是 provided
    引入,让二方库使用
    哟失去因具体版本号;无 log 具体实现,只依靠日志框架。
    2)稳定但追溯原则。每个版本的变迁应该被记录,二方库由何人保护,源码在哪,都亟待会
    惠及查到。除非用户主动提升版本,否则公共二方库的行为未该发生变化。
    (三) 服务器规约
  2. 【推荐】高并发服务器建议调整小 TCP 协议的 time_wait 超时时间。
    证实:操作系统默认 240 秒后,才见面倒闭处于 time_wait
    状态的连,在胜并发访问下,服务
    器端会因处在 time_wait
    的连年数最好多,可能无法树立新的接连,所以需要在服务器上调多少
    此等待值。
    正例:在 linux 服务器上请通过变更/etc/sysctl.conf
    文件去窜该少省值(秒):
    net.ipv4.tcp_fin_timeout = 30
  3. 【推荐】调大服务器所支持的最为老文件句柄数(File Descriptor,简写为
    fd)。
    证实:主流操作系统的计划是用 TCP/UDP
    连接使用和公事一律的法去管理,即一个连连对应
    深受一个 fd。主流的 linux 服务器默认所支持太深 fd 数量为
    1024,当并发连接数很老时坏容易
    阿里巴巴 JAVA 开发手册
    30 / 32

坐 fd 不足而起“open too many files”错误,导致新的连无法树立。
建议以 linux
服务器所支持的最为酷词柄数调高勤倍增(与服务器的内存数量相关)。 3.
【推荐】给 JVM 设置-XX:+HeapDumpOnOutOfMemoryError 参数,让 JVM 碰到 OOM
场景时输出 dump 信息。
证明:OOM
的有是有几率的,甚至发规律地相隔数月份才起相同章,出现不时之实地消息对查错
可怜有价。

  1. 【参考】服务器间重定向必须采用 forward;外部重定向地方必须运用 URL
    Broker 生成,
    不然因线上运用 HTTPS 协议而导致浏览器提示“不安全”。此外,还见面带动 URL
    维护不均等的
    问题。

阿里巴巴 JAVA 开发手册

五、安全规则

  1. 【强制】可给用户一直看的效能必须进行权力决定校验。
    说明:防止没有召开权限控制就不过自由走访、操作别人的多寡,比如查看、修改别人的订单。
  2. 【强制】用户敏感数据禁止直接显示,必须对展示数据脱敏。
    说明:支付宝中查看个人手机号码会显成:158****9119,隐藏中间 4
    位,防止隐私泄露。
  3. 【强制】用户输入的 SQL 参数严格使用参数绑定或者 METADATA
    字段值限定,防止 SQL 注入, 禁止字符串拼接 SQL 访问数据库。
  4. 【强制】用户要传入的旁参数必须开有效验证。
    说明:忽略参数校验可能引致:
     page size 过非常导致内存溢出
     恶意 order by 导致数据库慢查询
     正则输入源串拒绝服务 ReDOS
     任意重定向
     SQL 注入
     Shell 注入
     反序列化注入
  5. 【强制】禁止为 HTML 页面输出未经安全过滤或不对转义的用户数据。
  6. 【强制】表单、AJAX 提交必须尽 CSRF 安全过滤。 说明:CSRF(Cross-site
    request forgery)跨站请求伪造是相同近乎常见编程漏洞。对于有 CSRF
    漏洞的采用/网站,攻击者可优先构造好
    URL,只要受害者用户同样做客,后台就以用户不知
    情节情况下对数据库中用户参数进行对应修改。
  7. 【强制】URL 外部重定向传来的目标地址必须实行白名单过滤。
    正例:
    try { if (com.alibaba.fasttext.sec.url.CheckSafeUrl
    .getDefaultInstance().inWhiteList(targetUrl)){
    response.sendRedirect(targetUrl); } } catch (IOException e) {
    logger.error(“Check returnURL error! targetURL=” + targetURL, e); throw
    e;
    阿里巴巴 JAVA 开发手册
    32 / 32

  8. 【强制】Web 应用必须正确配置 Robots 文件,非 SEO URL
    必须安排也禁爬虫访问。
    User-agent: * Disallow: / 9.
    【强制】在应用平台资源,譬如短信、邮件、电话、下单、支付,必须兑现对的防重放范围,
    如数量限制、疲劳度控制、验证码校验,避免被滥刷、资损。
    证实:如注册时发送验证码到手机,如果没界定次数和效率,那么可运用这作用骚扰到那个
    她用户,并造成短信平台资源浪费。
    10.【推荐】发贴、评论、发送即时消息等用户生成内容之光景必须实现防刷、文本内容违禁词了
    滤等风控策略。

发表评论

电子邮件地址不会被公开。 必填项已用*标注