Java 代码开发规范

  • Post author:
  • Post category:java



一、阿里巴巴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 线程不安全



版权声明:本文为fangjial原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。