阿里java开发者手册读书笔记

POJO 类中布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误

杜绝完全不规范的缩写,避免望文不知义

Service/DAO 层方法命名规约

  1. 获取单个对象的方法用 get 做前缀
  2. 获取多个对象的方法用 list 做前缀,复数形式结尾如:listObjects。
  3. 获取统计值的方法用 count 做前缀。
  4. 插入的方法用 save/insert 做前缀。
  5. 删除的方法用 remove/delete 做前缀。
  6. 修改的方法用 update 做前缀。

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

Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals

所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较

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

1) 【强制】所有的 POJO 类属性必须使用包装数据类型。 2) 【强制】RPC 方法的返回值和参数必须使用包装数据类型。 3) 【推荐】所有的局部变量使用基本数据类型。

ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException 异常

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

使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历

SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为static,必须加锁,或者使用 DateUtils 工具类

避免 Random 实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed 导致的性能下降。

volatile 解决多线程内存不可见问题。对于一写多读,是可以解决变量同步问 但是如果多写,同样无法解决线程安全问题。如果是 count++操作,使用如下类实现: AtomicInteger count = new AtomicInteger(); count.addAndGet(1); 如果是 JDK8,推荐使用 LongAdder 对象,比 AtomicLong 性能更好(减少乐观锁的重试次数)

获取当前毫秒数 System.currentTimeMillis(); 而不是 new Date().getTime()

finally 块必须对资源对象、流对象进行关闭,有异常也要做 try-catch

对 trace/debug/info 级别的日志输出,必须使用条件输出形式或者使用占位符的方式。

表达是与否概念的字段,必须使用

is_xxx的方式命名,数据类型是unsigned tinyint(1表示是,0表示否)。

主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名

小数类型为 decimal,禁止使用 float 和 double

不得使用外键与级联,一切外键概念必须在应用层解决