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(); 

        } 

}

 

集合类KeyValueSuper说明
Hashtable不允许为 null不允许为 nullDictionary线程安全
TreeMap不允许为 null允许为 nullAbstractMap线程不安全
ConcurrentHashMap不允许为 null不允许为 nullAbstractMap锁分段技术(JDK8:CAS)
HashMap允许为 null允许为 nullAbstractMap线程不安全

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值