阿里Java开发手册记录
众所周知,java业界标准,随手记录自己没做好的地方,不定时更新…
一、 编程规约
(一)命名风格
1. POJO类(DO/DTO/BO/VO的统称)中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。
(二)代码风格
1. 缩进采用4个空格,禁止使用tab字符。 (idea不要勾选Use tab character,eclipse中需勾选insert spaces of tabs)
2. IDE的text file encoding设置为UTF-8; IDE中文件的换行符使用Unix格式,不要使用windows格式。
(三)OOP规约
1. 所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。
说明:对于Integer var = ? 在-128至127范围内的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。
2. 所有的POJO类属性必须使用包装数据类型。(数据库的查询结果可能是null,因为自动拆箱,用基本数据类型接收有NPE风险。)
3. RPC方法的返回值和参数必须使用包装数据类型。
4. 所有的局部变量使用基本数据类型。
5. 使用索引访问用String的split方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛IndexOutOfBoundsException的风险。
6. 循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展
(四)集合处理
1. 使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样的数组,大小就是list.size()。
2. 使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。(使用的适配器模式,只是转换接口,后台的数据仍然是数组)
3. 泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用get方法,做为接口调用赋值时易出错。 说明:扩展说一下PECS(Producer Extends Consumer Super)原则:1)频繁往外读取内容的,适合用上界Extends。2)经常往里插入的,适合用下界Super。
4. 不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。
`` Iterator<String> it = a.iterator();
while (it.hasNext()) {
String temp = it.next();
if (删除元素的条件) {
it.remove();
}
} ``
5. 在JDK7版本及以上,Comparator要满足如下三个条件,不然Arrays.sort,Collections.sort会报IllegalArgumentException异常。
6. 集合初始化时,指定集合初始值大小(initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意 负载因子(即loader factor)默认 为 0.75,如果 暂时 无法确定 初始 值大小,请设置 为 16。)
7. 使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。 说明:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。
最后附上最新的阿里java开发手册下载连接5mjq