3. 【强制】类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外: DO / BO /
DTO / VO / AO
正例: MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例: macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion

之前以为缩写词如TCP  等这些类名中也一直大写。

不规范缩写(有些单词不能缩写)

10. 【强制】杜绝完全不规范的缩写, 避免望文不知义。
反例: AbstractClass“ 缩写” 命名成 AbsClass; condition“ 缩写” 命名成 condi,此类随
意缩写严重降低了代码的可阅读性。

我就经常为了少些几个单词这个样搞。

12. 【推荐】如果模块、 接口、类、方法使用了设计模式,在命名时体现出具体模式。
说明: 将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。
正例: public class OrderFactory;
public class LoginProxy;
public class ResourceObserver;
16. 【参考】各层命名规约:
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。
2. 【强制】 long 或者 Long 初始赋值时, 使用大写的 L,不能是小写的 l,小写容易跟数字 1 混
淆,造成误解。
说明: Long a = 2l; 写的是数字的 21,还是 Long 型的 2?
3. 【推荐】不要使用一个常量类维护所有常量, 按常量功能进行归类,分开维护。
说明: 大而全的常量类,非得使用查找功能才能定位到修改的常量,不利于理解和维护。
正例: 缓存相关常量放在类 CacheConsts 下; 系统配置相关常量放在类 ConfigConsts 下。
2. 【强制】 左小括号和字符之间不出现空格; 同样,右小括号和字符之间也不出现空格。详见
第 5 条下方正例提示。
反例: if (空格 a == b 空格)
3. 【强制】 if/for/while/switch/do 等保留字与括号之间都必须加空格。
4. 【强制】任何二目、 三目运算符的左右两边都需要加一个空格。
说明: 运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号等。
5. 【强制】 采用 4 个空格缩进,禁止使用 tab 字符。
说明: 如果使用 tab 缩进,必须设置 1 个 tab 为 4 个空格。 IDEA 设置 tab 为 4 个空格时,
请勿勾选 Use tab character;而在 eclipse 中,必须勾选 insert spaces for tabs。

(四)OOP规约

6. 【强制】 注释的双斜线与注释内容之间有且仅有一个空格。
正例: // 注释内容, 注意在//和注释内容之间有一个空格。
3. 【强制】相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object。
说明: 可变参数必须放置在参数列表的最后。 ( 提倡同学们尽量不用可变参数编程)
正例: public User getUsers(String type, Integer... ids) {...}

这里没懂?why?可变参数会有什么bug吗?

6. 【强制】 Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用
equals。
正例: "test".equals(object);
反例: object.equals("test");
说明: 推荐使用 java.util.Objects#equals( JDK7 引入的工具类)
7.【强制】所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。
说明: 对于 Integer var = ? 在-128 至 127 范围内的赋值, Integer 对象是在
IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行
判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,
推荐使用 equals 方法进行判断。

就是说

Integer n1=1000;
Integer n2=1000;
System.out.println(n1==n2);  //结果为false  这确实是个坑。

8. 关于基本数据类型与包装数据类型的使用标准如下:

1) 【强制】 所有的 POJO 类属性必须使用包装数据类型。
2) 【强制】 RPC 方法的返回值和参数必须使用包装数据类型。
3) 【 推荐】 所有的局部变量使用基本数据类型。
说明: POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何
NPE 问题,或者入库检查,都由使用者来保证。
正例: 数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。
反例: 比如显示成交总额涨跌情况,即正负 x%, x 为基本数据类型,调用的 RPC 服务,调用
不成功时,返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线。所以包装
数据类型的 null 值,能够表示额外的信息,如:远程调用失败,异常退出

9. 【强制】定义 DO/DTO/VO POJO 类时,不要设定任何属性默认值

反例: POJO 类的 gmtCreate 默认值为 new Date();但是这个属性在数据提取时并没有置入具
体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。

uid的生成 +Add genxxxx

10. 【强制】序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败; 如
果完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。
说明: 注意 serialVersionUID 不一致会抛出序列化运行时异常。

11. 【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。
 我就有时候为了省事,直接写构造里。

toString 方法

12. 【强制】 POJO 类必须写 toString 方法。使用 IDE 的中工具: source> generate toString
时,如果继承了另一个 POJO 类,注意在前面加一下 super.toString。
说明: 在方法执行抛出异常时,可以直接调用 POJO 的 toString()方法打印其属性值,便于排
查问题

15. 【推荐】 类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter方法。

说明: 公有方法是类的调用者和维护者最关心的方法,首屏展示最好; 保护方法虽然只是子类
关心,也可能是“模板设计模式”下的核心方法; 而私有方法外部一般不需要特别关心,是一个
黑盒实现; 因为承载的信息价值较低,所有 Service 和 DAO 的 getter/setter 方法放在类体
最后。
16. 【推荐】 setter 方法中,参数名称与类成员变量名称一致, this.成员名 = 参数名。在
getter/setter 方法中, 不要增加业务逻辑,增加排查问题的难度。
反例:
public Integer getData() {
if (true) {
return this.data + 100;
} else {
return this.data - 100;
}
}

17. 【推荐】循环体内,字符串的连接方式,使用 StringBuilder append 方法进行扩展。

说明: 反编译出的字节码文件显示每次循环都会 new 出一个 StringBuilder 对象,然后进行
append 操作,最后通过 toString 方法返回 String 对象,造成内存资源浪费。
反例:
String str = "start";
for (int i = 0; i < 100; i++) {
str = str + "hello";
}

以上说明的已经很明确了。

String 类型和 StringBuilder  类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
 而如果是使用  StringBuilder  类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。

18. 【推荐】 final 可以声明类、成员变量、方法、以及本地变量,下列情况使用 final 关键字:

1) 不允许被继承的类,如: String 类。
2) 不允许修改引用的域对象,如: POJO 类的域变量。
3) 不允许被重写的方法,如: POJO 类的 setter 方法。
4) 不允许运行过程中重新赋值的局部变量。
5) 避免上下文重复使用一个变量,使用 final 描述可以强制重新定义一个变量,方便更好
地进行重构。

19. 【推荐】慎用 Object clone 方法来拷贝对象。

说明: 对象的 clone 方法默认是浅拷贝,若想实现深拷贝需要重写 clone 方法实现属性对象
的拷贝

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. 【强制】 关于 hashCode equals 的处理,遵循如下规则:
1) 只要重写 equals,就必须重写 hashCode。
2) 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的
对象必须重写这两个方法。
3) 如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals。
说明: String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象
作为 key 来使用。

数组<===>集合转换

集合转数组
4. 【强制】使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完全
一样的数组,大小就是 list.size()。
说明: 使用 toArray 带参方法,入参分配的数组空间不够大时, toArray 方法内部将重新分配
内存空间,并返回新数组地址; 如果数组元素大于实际所需,下标为[ list.size() ]的数组
元素将被置为 null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素
个数一致。 正例:
List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);
反例: 直接使用 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)也会随之修改。

增强for循环的坑 

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);
}
}
说明: 以上代码的执行结果肯定会出乎大家的意料,那么试一下把“1”换成“2”,会是同样的
结果吗?

换成“2”后,已经将最后一个元素remove了,(未做检查的情况下)还在继续找下一个,报错 java.util.ConcurrentModificationException,所以用正例 中 iterator

9.【推荐】集合初始化时, 指定集合初始值大小。
说明: HashMap 使用 HashMap(int initialCapacity) 初始化,
正例:initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子 ( 即 loader
factor) 默认为 0.75, 如果暂时无法确定初始值大小,请设置为 16(即默认值) 。
反例: HashMap 需要放置 1024 个元素, 由于没有设置容量初始大小,随着元素不断增加,容
量 7 次被迫扩大, resize 需要重建 hash 表,严重影响性能。

(六)并发处理

线程池的创建

4. 【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样
的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
说明: Executors 返回的线程池对象的弊端如下:
1) FixedThreadPool 和 SingleThreadPool:
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
2) CachedThreadPool 和 ScheduledThreadPool:
允许的创建线程数量为 Integer.MAX_VALUE, 可能会创建大量的线程,从而导致 OOM。

(七)控制语句

1. 【强制】在一个 switch 块内,每个 case 要么通过 break/return 等来终止,要么注释说明程
序将继续执行到哪一个 case 为止; 在一个 switch 块内,都必须包含一个 default 语句并且
放在最后,即使它什么代码也没有。

这个default 我一直有写

2. 【强制】在 if/else/for/while/do 语句中必须使用大括号。 即使只有一行代码,避免采用
单行的编码方式: if (condition) statements;

这个我大括号我以前能省就省了

3. 【推荐】 表达异常的分支时, 少用 if-else 方式, 这种方式可以改写成:
if (condition) {
...
return obj;
}
// 接着写 else 的业务逻辑代码;
说明: 如果非得使用 if()...else if()...else...方式表达逻辑,【强制】 避免后续代码维
护困难, 请勿超过 3 层。
正例: 超过 3 层的 if-else 的逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现,
其中卫语句示例如下:
public void today() {
if (isBusy()) {
System.out.println(“change time.”);
return;
}
if (isFree()) {
System.out.println(“go to travel.”);
return;
}
System.out.println(“stay at home to learn Alibaba Java Coding Guidelines.”);
return;
}

if()判断内不要写一大坨东西

4. 【推荐】除常用方法(如 getXxx/isXxx)等外,不要在条件判断中执行其它复杂的语句,将复
杂逻辑判断的结果赋值给一个有意义的布尔变量名,以提高可读性。
说明: 很多 if 语句内的逻辑相当复杂,阅读者需要分析条件表达式的最终结果,才能明确什么
样的条件执行什么样的语句,那么,如果阅读者分析逻辑表达式错误呢?
正例:
// 伪代码如下
final boolean existed = (file.open(fileName, "w") != null) && (...) || (...);
if (existed) {
...
}
反例:
if ((file.open(fileName, "w") != null) && (...) || (...)) {
...
}

参数检查

7. 【参考】 下列情形,需要进行参数校验:
1) 调用频次低的方法。
2) 执行时间开销很大的方法。 此情形中, 参数校验时间几乎可以忽略不计,但如果因为参
数错误导致中间执行回退,或者错误,那得不偿失。
3) 需要极高稳定性和可用性的方法。
4) 对外提供的开放接口,不管是 RPC/API/HTTP 接口。
5) 敏感权限入口。

参数检查一般都没管

(八)注释规约
http://www.cnblogs.com/yanghaolie/p/8472364.html

												

阿里巴巴java开发手册 学习的更多相关文章

  1. 阿里巴巴java开发手册学习记录,php版

    一.编程规约 (一)命名风格 1.目录使用小写+下划线 home,view,model,admin_view 2.类 UpperCamelCase PhpMailer方法 lowerCamelCase ...

  2. 阿里巴巴Java开发手册快速学习

    Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性. 善医者“未有形而除之”,提高工程健壮性 ...

  3. 阿里巴巴Java开发手册正确学习姿势是怎样的?刷新代码规范认知

    很多人都知道,阿里巴巴在2017发布了<阿里巴巴Java开发手册>,前后推出了很多个版本,并在后续推出了与之配套的IDEA插件和书籍. 相信很多Java开发都或多或少看过这份手册,这份手册 ...

  4. 阿里巴巴Java开发手册———个人追加的见解和补充(一)

    先上干货,<阿里巴巴Java开发手册>的下载地址 https://yq.aliyun.com/articles/69327?spm=5176.100239.blogcont69327.15 ...

  5. 阿里巴巴Java开发手册评述

    2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...

  6. 读阿里巴巴Java开发手册v1.2.0之编程规约有感【架构篇】

     不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么 ...

  7. 《阿里巴巴Java开发手册v1.2》解析(编程规约篇)

    之前在乐视天天研究各种底层高大上的东西,因为我就一个人,想怎么弄怎么弄.如今来了新美大,好好研读一下<阿里巴巴Java开发手册v1.2>.还要对这么看似简单的东西解析一番.毕竟现在带团队, ...

  8. 阿里巴巴Java开发手册思维导图

    趁着有时间把阿里巴巴Java开发手册又看了一遍了,很多时候觉得看完之后,发现自己好像一点都不记得了里面的内容了.只能把大概内容画一遍在脑子里形成一张图方便记忆,这样就更能够记得自己的看完的内容了.其中 ...

  9. 阿里巴巴Java开发手册评

    2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...

随机推荐

  1. HTML连载27-层叠性&优先级&!important用法

    一.层叠性 1.定义:CSS处理冲突的一种能力 2.注意点:层叠性只有在多个选择器中“同一标签”,然后又设置了“相同的属性”,才会发生层叠性 3.CSS缩写:Cascading StyleSheet ...

  2. 目标检测 <二> TensorFlow安装

    一:创建TensorFlow工作环境目录 1. 在anconda安装目录下找到envs目录然后进入 2. 在当前目录下创建一个文件夹改名为tensorflow 二: 创建TensorFlow工作环境 ...

  3. json data转匿名对象C#

    using Newtonsoft.Json.Linq; 代码如下: static void Main(string[] args) { Console.WriteLine("Test 4.8 ...

  4. python3 字符和数字(ASC码)转换

    print(ord('b')) print(ord('B')) print(chr(98)) print(chr(66)) 结果:98 66 b B 也可以数字转ASC码,原理一样,如下(结果就不输出 ...

  5. Laravel HTML导出 PDF ----- wkhtmltopdf Laravel-snappy

    需求:将复杂的展示页 (包含大量 echarts) 转换成 PDF供用户下载 1.下载安装wkhtmltoxpdf 选择自己的系统版本下载并安装 rpm -ivh wkhtmltox--.centos ...

  6. Nginx 极简入门教程!

    上篇文章和大家聊了 Spring Session 实现 Session 共享的问题,有的小伙伴看了后表示对 Nginx 还是很懵,因此有了这篇文章,算是一个 Nginx 扫盲入门吧! 基本介绍 Ngi ...

  7. 'while' statement cannot complete without throwing an exception

    You are probably using Android Studio or IntelliJ. If so, you can add this above your method contain ...

  8. python 进程和线程-进程和线程的比较以及分布式进程

    进程和线程的比较 参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017631469467456 我们介绍了多进程和多线程,这是实现多任 ...

  9. P2704 [NOI2001]炮兵阵地 (状压DP)

    题目: P2704 [NOI2001]炮兵阵地 解析: 和互不侵犯一样 就是多了一格 用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵 发现 ...

  10. Spring Cloud Gateway转发Spring WebSocket

    Spring Cloud Gateway转发Spring WebSocket 源码:https://github.com/naah69/SpringCloud-Gateway-WebSocket-De ...