阿里JAVA 开发手册—-整理


1、命名严禁使用拼音与英文混合的方式。

2、领域模型命名规约
1) 数据对象: xxxDO, xxx 即为数据表名。
2) 数据传输对象: xxxDTO, xxx 为业务领域相关的名称。
3) 展示对象: xxxVO, xxx 一般为网页名称。
4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。

3、long 或者 Long 初始赋值时,必须使用大写的 L,小写容易跟数字 1
混淆,造成误解。

4、避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成
本,直接用类名来访问即可。

5、说明: 可变参数必须放置在参数列表的最后。(提倡同学们尽量不用可变参数编程)
正例: public User getUsers(String type, Integer… ids);(可为null的参数放最后)

6、Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。
正例: "test".equals(object);

7、所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。
说明: 对于 Integer var=?在-128 至 127 之间的赋值, Integer 对象是在 IntegerCache.cache
产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之
外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方
法进行判断。

8、注意 serialVersionUID 不一致会抛出序列化运行时异常。

9、关于基本数据类型与包装数据类型的使用标准如下:
1) 所有的 POJO 类属性必须使用包装数据类型。
2) RPC 方法的返回值和参数必须使用包装数据类型。
3) 所有的局部变量推荐使用基本数据类型。

10、final 可提高程序响应效率,声明成 final 的情况:
1) 不需要重新赋值的变量,包括类属性、局部变量。
2) 对象参数前加 final,表示不允许修改引用的指向。
3) 类方法确定不允许被重写。

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


12、Map/Set 的 key 为自定义对象时,必须重写 hashCode 和 equals。
正例: String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象作
为 key 来使用。

13、ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException
异常: java.util.RandomAccessSubList cannot be cast to java.util.ArrayList ;
说明: subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是 ArrayList
的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。

14、List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);
说明: 使用 toArray 带参方法,入参分配的数组空间不够大时, toArray 方法内部将重新分配
内存空间,并返回新数组地址;如果数组元素大于实际所需,下标为[ list.size() ]的数组
元素将被置为 null,其它数组元素保持原值。

15、使用工具类 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)也会随之修改。

16、不要在 foreach 循环里进行元素的 remove/add 操作(会抛出ConcurrentModificationException)。 remove 元素请使用 Iterator
方式,如果并发操作,需要对 Iterator 对象加锁。

17、Map集合:values()返回的是 V 值集合,是一个 list 集合对象; keySet()返回的是 K 值集合,是
一个 Set 集合对象; entrySet()返回的是 K-V 值组合集合。


18、高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能
锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。

19、线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样
的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
说明: Executors 各个方法的弊端:
1) newFixedThreadPool 和 newSingleThreadExecutor:
主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至 OOM。
2) newCachedThreadPool 和 newScheduledThreadPool:
主要问题是线程数最大数是 Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至 OOM。

20、注意,子线程抛出异常堆栈,不能在主线程 try-catch 到。

21、注意 Math.random() 这个方法返回是 double 类型,注意取值范围 0≤x<1(能够取
到零值,注意除零异常)。


22、单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。

23、where a=? and b>? 多个查询条件,区分度高的在前,有=的在前。

24、禁止使用存储过程,存储过程难以调试和扩展,更没有移植性(隐藏在DB中,不直观难维护)。

25、删除和修改记录时,要先 select,避免出现误删除,确认无误才能
提交执行。

26、in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控
制在 1000 个之内。

27、<isNotEmpty>表示不为空且不为 null 时执行; <isNotNull>表示不为 null 值时执行。

28、mysql类型DECIMAL 实际是以串存放的。尽量用DECIMAL取代float和double。

–分为Java语言部分、集合框架、Java线程与并发、数据库。

https://yq.aliyun.com/articles/240163?spm=5176.10695662.1996646101.searchclickresult.7b4515c54fNXir

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

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