《阿里巴巴java开发手册》读书笔记

237 阅读3分钟

在美团实习时,做需求前也看过手册,但那时只是囫囵吞枣的看了一遍,现在再来复习下,写写心得。

以下整理出自己不太熟悉的几条规约,方便记忆:

编程规约

  1. pojo类中布尔类型变量都不要加is前缀,否则部分框架解析会引起序列化错误
定义基本数据类型Boolean isDeleted;的属性,它的方法名称也是isDeleted(),RPC框架在反向解析的时候,“误以为”对应的属性名称是deleted,导致属性获取不到抛出异常。

2.使用4个空格缩进而不是tab键。(也可以设置tab为4个空格)

oop规约

1.当序列化类新增属性时,不要修改serialVersionUID字段,以避免反序列化失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值。

2.构造方法中禁止加入任何业务逻辑,如果有初始化逻辑,请放到init方法中。

集合处理

1.ArrayList的subList结果不可强转成ArrayList,否则会跑出ClassCastException异常。

subList返回的是ArrayList的内部类SubList,并不是ArrayList,而是ArrayList的一个视
图,对于SubList子列表的所有操作最终会反映到原链表上

2.使用集合转数组的方法,必须使用集合的toArray(T[] array),传入是类型完全一致的数组,大小就是list.size()。

说明:当使用toArray带参方法,入参分配的数组空间不够大时,toArray方法内部将重新分配内存空间,并返回新数组地址,如果数组元素大于实际所需,下表为[list.size()]的元素将被置为null,其他数组元素保持原值,因此最好将方法入参数组大小定义为与集合元素个数一致
直接使用toArray无参方法存在问题。此方法返回值只能是Object[]类,若强转为其他类型,数组将出现ClassCastException错误

3.使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会跑出 UnSupportedOperationException异常。

asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
如果修改数组元素,集合的元素也会被修改

4.泛型通配符<? extends T>用来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用get方法,因为其作为接口调用赋值时易出错。

5.不在foreach循环里进行元素的remove/add操作。remove元素使用iterator方式,如果并发操作,需要对iterator对象加锁。

6.使用entrySet遍历map类集合k/v,而不是用keySet方式遍历

keySet其实遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。如果是jak8,使用Map.foreach方法。