阿里巴巴Java开发手册终极版
2019独角兽企业重金招聘Python工程师标准>>>
一、编程规约:
(一)命名风格
1. 【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
反例: _name / __name / $Object / name_ / name$ / Object$
2.【强制】类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外: DO / BO / DTO / VO / AO
正例: MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
3.【强制】 POJO 类中布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误。
反例: 定义为基本数据类型 Boolean isDeleted; 的属性,它的方法也是 isDeleted(), RPC框架在反向解析的时候, “以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。
4.【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
正例: 应用工具类包名为 com.alibaba.open.util、类名为 MessageUtils( 此规则参考spring 的框架结构)
5. 【参考】各层命名规约:
Service/DAO 层方法命名规约
- 获取单个对象的方法用 get 做前缀。
- 获取多个对象的方法用 list 做前缀。
- 获取统计值的方法用 count 做前缀。
- 插入的方法用 save/insert 做前缀。
- 删除的方法用 remove/delete 做前缀。
- 修改的方法用 update 做前缀。
领域模型命名规约
- 数据对象: xxxDO, xxx 即为数据表名。
- 数据传输对象: xxxDTO, xxx 为业务领域相关的名称。
- 展示对象: xxxVO, xxx 一般为网页名称。
- POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。
(二)常量定义
1.【推荐】不要使用一个常量类维护所有常量, 按常量功能进行归类,分开维护。
正例: 缓存相关常量放在类 CacheConsts 下; 系统配置相关常量放在类 ConfigConsts 下。
2.【推荐】常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。
1) 跨应用共享常量:放置在二方库中,通常是 client.jar 中的 constant 目录下。
2) 应用内共享常量:放置在一方库中, 通常是 modules 中的 constant 目录下。
反例: 易懂变量也要统一定义成应用内共享常量,两位攻城师在两个类中分别定义了表示“是”的变量:
类 A 中: public static final String YES = "yes";
类 B 中: public static final String YES = "y";
A.YES.equals(B.YES),预期是 true,但实际返回为 false,导致线上问题。
3) 子工程内部共享常量:即在当前子工程的 constant 目录下。
4) 包内共享常量:即在当前包下单独的 constant 目录下。
5) 类内共享常量:直接在类内部 private static final 定义。
3.【推荐】如果变量值仅在一个范围内变化,且带有名称之外的延伸属性, 定义为枚举类。下面正例中的数字就是延伸信息,表示星期几。
正例: public Enum { MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6),SUNDAY(7);}
(三)代码格式
1.【强制】 左小括号和字符之间不出现空格; 同样,右小括号和字符之间也不出现空格。详见第 5 条下方正例提示
反例: if (空格 a == b 空格)
2.【强制】 if/for/while/switch/do 等保留字与括号之间都必须加空格。
3.【强制】 采用 4 个空格缩进,禁止使用 tab 字符。
4.【强制】 注释的双斜线与注释内容之间有且仅有一个空格。
5.【强制】方法参数在定义和传入时,多个参数逗号后边必须加空格。
6.【强制】 IDE 的 text file encoding 设置为 UTF-8; IDE 中文件的换行符使用 Unix 格式,不要使用 Windows 格式。
7. 【推荐】方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义之间插入一个空行。相同业务逻辑和语义之间不需要插入空行。
说明: 没有必要插入多个空行进行隔开。
(四)OOP 规约
1. 【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。
2. 【强制】所有的覆写方法,必须加@Override 注解。
说明: 加@Override可以准确判断是否覆盖成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。
3.【强制】相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object。
说明: 可变参数必须放置在参数列表的最后。 ( 提倡同学们尽量不用可变参数编程)
正例: public User getUsers(String type, Integer... ids) {...}
4. 【强制】外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生
影响。接口过时必须加@Deprecated 注解,并清晰地说明采用的新接口或者新服务是什么。
5. 【强制】不能使用过时的类或方法。
6.【强制】 Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。
正例: "test".equals(object);
说明: 推荐使用 java.util.Objects#equals( JDK7 引入的工具类)
7.【强制】所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。
说明: 对于 Integer var = ? 在-128 至 127 范围内的赋值, Integer 对象是在IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断
8. 关于基本数据类型与包装数据类型的使用标准如下:
- 【强制】 所有的 POJO 类属性必须使用包装数据类型。
- 【强制】 RPC 方法的返回值和参数必须使用包装数据类型。
- 【 推荐】 所有的局部变量使用基本数据类型。
说明: POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何NPE 问题,或者入库检查,都由使用者来保证。
正例: 数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。
9.【强制】定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。
10.【强制】序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败; 如果完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。
说明: 注意 serialVersionUID 不一致会抛出序列化运行时异常。
11. 【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。
12.【推荐】 类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter方法。
13.【推荐】循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。
说明: 反编译出的字节码文件显示每次循环都会 new 出一个 StringBuilder 对象,然后进行append 操作,最后通过 toString 方法返回 String 对象,造成内存资源浪费。
反例:
String str = "start";
for (int i = 0; i < 100; i++) {
str = str + "hello";
}
(五)集合处理
1. 【强制】 关于 hashCode 和 equals 的处理,遵循如下规则:
- 只要重写 equals,就必须重写 hashCode。
- 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。
- 如果自定义对象做为 Map 的键,那么必须重写 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 带参方法,入参分配的数组空间不够大时, toArray 方法内部将重新分配内存空间,并返回新数组地址; 如果数组元素大于实际所需,下标为[ list.size() ]的数组元素将被置为 null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致。
正例:
List<String> list = new ArrayList<String>(2);
list.add("abc");
list.add("def");
String[] array = new String[list.size()];
array = list.toArray(array);
for (int i = 0 ; i < array.length ; i++ ){System.out.println("===="+array[i]);
}
反例: 直接使用 toArray 无参方法存在问题,此方法返回值只能是 Object[]类,若强转其它类型数组将出现 ClassCastException 错误。
5.【强制】使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
说明: asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
String[] str = new String[] { "you", "wu" };
List list = Arrays.asList(str);
第一种情况: list.add("yangguanbao"); 运行时异常。
第二种情况: str[0] = "gujin"; 那么 list.get(0)也会随之修改。
6.【强制】泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用 add 方法, 而<? super T>不能使用 get 方法,做为接口调用赋值时易出错。
说明: 扩展说一下 PECS(Producer Extends Consumer Super)原则: 第一、 频繁往外读取内容的,适合用<? extends T>。 第二、 经常往里插入的,适合用<? super T>。
7. 【强制】不要在 foreach 循环里进行元素的 remove/add 操作。 remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁
正例:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {String item = iterator.next();if (删除元素的条件) {iterator.remove();}
}
反例:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
for (String item : list) {if ("1".equals(item)) {list.remove(item);}
}
8. 【强制】 在 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 比较结果相同。
9. 【推荐】集合初始化时, 指定集合初始值大小。
说明: HashMap 使用 HashMap(int initialCapacity) 初始化,
说明: HashMap 使用 HashMap(int initialCapacity) 初始化,
正例:initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子 ( 即 loaderfactor) 默认为 0.75, 如果暂时无法确定初始值大小,请设置为 16(即默认值) 。
反例: HashMap 需要放置 1024 个元素, 由于没有设置容量初始大小,随着元素不断增加,容量 7 次被迫扩大, resize 需要重建 hash 表,严重影响性能。
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 锁分段技术( JDK8:CAS)
TreeMap 不允许为 null 允许为 null AbstractMap 线程不安全
HashMap 允许为 null 允许为 null AbstractMap 线程不安全
12. 【参考】利用 Set 元素唯一的特性,可以快速对一个集合进行去重操作,避免使用 List 的 contains 方法进行遍历、对比、 去重操作。
转载于:https://my.oschina.net/LucasZhu/blog/1580864
阿里巴巴Java开发手册终极版相关推荐
- 一份我们团队Java开发的开发规范,参考了阿里巴巴Java开发手册终极版v1.3.0
编程规约 For variable name, always use English with lowerCamelCase. space in comment: bad example: Sugge ...
- 《阿里巴巴Java开发手册(终极版)》
今天<阿里巴巴Java开发手册(终极版)>出炉-- 1.新版本历程 10月份阿里会出炉针对开发规范开发的IDE插件,值得期待! 2.新版本下载地址: https://pan.baidu.c ...
- 阿里巴巴Java开发手册终极版网页版v1.3.0
前言 一 .编程规约 ( 一 ) 命名风格 ( 二 ) 常量定义 ( 三 ) 代码格式 ( 四 ) OOP规约 ( 五 ) 集合处理 ( 六 ) 并发处理 ( 七 ) 控制语句 ( 八 ) 注释规约 ...
- 阿里巴巴Java开发手册终极版v1.3.0
链接:https://pan.baidu.com/s/1Eo1tOqn7CdE0e-d47Ztp0Q 提取码:6dmq
- 阿里官方Java代码规范标准《阿里巴巴Java开发手册 终极版 v1.3.0》下载
转载:https://www.cnblogs.com/han-1034683568/p/7680354.html
- 阿里巴巴Java开发手册(嵩山版)v1.7.0 及各个历史版本 百度云直接带走 不需要其他操作
阿里巴巴Java开发手册(嵩山版)v1.7.0 阿里巴巴Java开发手册(泰山版)v1.6.0 阿里巴巴Java开发手册(华山版)v1.5.0 阿里巴巴Java开发手册(详尽版)v1.4.0 阿里巴巴 ...
- 它来了:阿里巴巴Java开发手册泰山版解读
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「阿飞的博客」 <Java开发手册 ...
- 阿里巴巴Java开发手册详尽版和华山版下载
更新日志: -------------- 2019.06.19日更新 -------------- 1.新增21条新规约.比如,switch的空指针问题.浮点数的比较.无泛型限制引起的类型混乱.加锁与 ...
- 阿里巴巴Java开发手册(正式版)
---------引自网络 目录 一. 编程规约............................................................................ ...
最新文章
- jquery.datatable能返回数据绑不上_地磁场可以影响人体机能吗?解释有多种,但都不理想...
- 【NOIP2002】【codevs1098】均分纸牌
- 净误差与遗漏为负值的含义_巴丹吉林沙漠湖泊水位变化及地下水净补给量
- 计算机组成原理第三章视频,计算机组成原理 第3章 3.4 十进制转换二进制
- org.springframework.http.converter.HttpMessageNotWritableException:
- 年度最佳代码“不管你们信不信,反正我信了”
- [jquery] 删除文章的时候弹出确认窗口
- [码海拾贝 之TC] 使用View 定义动态的Class
- 条款34:区分接口继承和实现继承(Different between inheritance of interface and inheritance of implemenation)...
- 经典排序算法学习笔记七——堆排序
- Mac下compare beyond无限使用
- 155款安卓开源项目源码整理,总有你要找的(精心收集)
- java 工作流引擎调研总结
- 教你轻松玩转天线效应(Process Antenna Effect)
- POJ 3345 Bribing FIPA 树上背包
- 自动化测试 | 这些常用测试平台,你们公司在用的是哪些呢?
- cocos2dX 之音乐与音效
- QT Linux实现AT指令处理框架
- 什么是MISRA?如何满足该行业标准?
- 仿制微信/QQ在线聊天网站
热门文章
- Java工具类——通过配置XML验证Map
- postgresql数据库去重方法
- 僵尸进程和孤儿进程 转载
- 130242014022 蓝宏铮 第2次实验
- windows下快速启动或关闭系统服务方法
- if...else..的错误用法
- hdu3081 Marriage Match II(最大流)
- linux如何过滤字符串,在linux系统如何grep过滤中,不包含某些字符串的命令
- 移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网
- 全国计算机等级考试题库二级C操作题100套(第53套)