一、阿里巴巴Java开发手册下载
链接: https://pan.baidu.com/s/1VVsz1UIyOIJDXlzrBy6faQ?pwd=4skg 提取码: 4skg 复制这段内容后打开百度网盘手机App,操作更方便
二、阅读须知
POJO plain ordinary java object 普通java对象
-------DO Data object 数据对象,一个DO 通常来说 对应一张表,或者是Mapper查询接口中的返回类型 Mapper和dao返回的都是DO
-------DTO Data Transfer Object,数据传输对象,service组件需要将dao组件返回的DO对象给封装成DTO对象,再返回给controller组件,或者是别的service组件。service必须将数据封装为DTO,返回给其他的controller或者是service来使用
-------VO view object,其实就是将页面中需要展示的数据封装在VO里面,然后在以前是将VO给传输给页面模板,比如JSP(JSTL标签语法,可以将VO中的数据给展示出来),freemarker,velocity,thymeleaf。restful接口,在接口中可以将一个接口要返回的数据,封装在VO里面,从接口返回即可。
-------PO 就是将DO不是作为data object,而是作为domain object,然后将PO作为persistence object,一个PO对应一张表,DO就是我们平时放在domain包中的领域模型对象
-------AO application object,就是跟展示层相关的一些数据
RPC Remote Procedure Call 远程过程调用
NPE NullPointerException 空指针异常
三、大致内容
日期格式化时,传入 pattern 中表示年份统一使用小写的 y。
yyyy表示年。YYYY表示一年中的第几周
类成员与方法访问控制从严:
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 成员方法或成员变量,删除一下,不得手心冒点汗吗? 变量像自己的小孩,尽量在自己的视线内,变量作用域太大,无限制的到处跑,那么你会担心的。
BigDecimal 的等值比较应使用 compareTo() 方法,而不是 equals() 方法。
equalis会比较值和精度(1.0和1.00返回结果为false),而compareTo会忽略精度
定义数据对象 DO 类时,属性类型要与数据库字段类型相匹配。
数据库字段的 bigint 必须与类属性的 Long 类型相对应。
禁止使用构造方法 BigDecimal(double) 的方式把 double 值转化为 BigDecimal 对象。
BigDecimal(double) 存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。如涉及到货币的计算逻辑,当计算体量变多时,可能就会出现少了1分钱的误差,将会使客户产生今天少一分钱,明天就会少1块钱,后面可能会少100块...
如:
BigDecimal g = new BigDecimal(0.1F);
实际的存储值为:0.100000001490116119384765625
正例:优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了 Double 的 toString,而 Double 的 toString 按 double 的实际能表达的精度对尾数进行了截断。
BigDecimal recommend1 = new BigDecimal("0.1"); BigDecimal recommend2 = BigDecimal.valueOf(0.1);
构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。
禁止在 POJO 类中,同时存在对应属性 xxx 的 isXxx() 和 getXxx() 方法。
当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读, 此条规则优先于下一条。
若需要在循环中多次拼接字符串,最好使用StringBuilder的append方法,能够加快编译速度
反编译出的字节码文件显示每次循环都会 new 出一个 StringBuilder 对象,然后进行 append 操作,最后通过 toString() 返回 String 对象,造成内存资源浪费。
final 可以声明类、成员变量、方法、以及本地变量,下列情况使用 final 关键字:
1)不允许被继承的类,如:String 类。
2)不允许修改引用的域对象,如:POJO 类的域变量。
3)不允许被覆写的方法,如:POJO 类的 setter 方法。
4)不允许运行过程中重新赋值的局部变量。
5)避免上下文重复使用一个变量,使用 final 关键字可以强制重新定义一个变量,方便更好地进行重构。
慎用 Object 的 clone 方法来拷贝对象。
说明:对象 clone 方法默认是浅拷贝,若想实现深拷贝需覆写 clone 方法实现域对象的深度遍历式拷贝。
获取当前毫秒数:System.currentTimeMillis();而不是 new Date().getTime()。
说明:获取纳秒级时间,则使用 System.nanoTime 的方式。在 JDK8 中,针对统计时间等场景,推荐使用 Instant 类。
禁止在程序中写死一年为 365 天,避免在公历闰年时出现日期转换错误或程序逻辑错误。
正例:
// 获取今年的天数
int daysOfThisYear = LocalDate.now().lengthOfYear();
// 获取指定某年的天数
LocalDate.of(2011, 1, 1).lengthOfYear();
不要在 foreach 循环里进行元素的 remove / add 操作。
remove 元素请使用 iterator 方式, 如果并发操作,需要对 iterator 对象加锁。
正例:
List list = new ArrayList<>(); list.add("1"); list.add("2"); Iterator iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if (删除元素的条件) { iterator.remove(); } }
集合类 | Key | Value | Super | 说明 |
Hashtable | 不允许为 null | 不允许为 null | Dictionary | 线程安全 |
TreeMap | 不允许为 null | 允许为 null | AbstractMap | 线程不安全 |
ConcurrentHashMap | 不允许为 null | 不允许为 null | AbstractMap | 锁分段技术(JDK8:CAS) |
HashMap | 允许为 null | 允许为 null | AbstractMap | 线程不安全 |