Java手册中的【强制】、【推荐】、【参考】是按照同一类型一条条罗列归纳的,而我打算按照项目中的代码为中心,比对手册中的规范进行学习和总结,一方面纠正自己不好的编程习惯,二是养成一种规范编码的意识。
那就从最简单的POJO(即简单的Java对象)开始吧:(以定义的VO类为例)
package com.xxwei.demo.enity.vo;
import java.io.Serializable;
import java.util.Objects;
/**
* 【参考】POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO,展示对象:xxxVO,xxx 一般为网页名称。
* 【强制】序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。
* 【强制】类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。
* 【强制】所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
* 【强制】代码和注释中都要避免使用任何语言的种族歧视性词语。
* 【强制】所有的类都必须添加创建者和创建日期。
* 【强制】类、类属性、类方法的注释必须使用 Javadoc 规范,使用格式,不得使用// xxx 方式。
* 【推荐】与其“半吊子”英文来注释,不如用中文注释把问题说清楚。专有名词与关键字保持英文原文即可。
* 【推荐】代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑等的修改。
* 【参考】在类中删除未使用的任何字段、方法、内部类;在方法中删除未使用的任何参数声明与内部变量。
*/
public class OrderVO implements Serializable {
private static final long serialVersionUID = 1000L;
// 【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格。
// 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
// 【强制】定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。
// 【强制】所有的 POJO 类属性必须使用包装数据类型。
// 【强制】定义数据对象 DO 类时,属性类型要与数据库字段类型相匹配。
// 【强制】杜绝完全不规范的缩写,避免望文不知义,如orderCount不能写成orderC。
// 【推荐】为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词组合来表达。
// 【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。
// 【推荐】在常量与变量的命名时,表示类型的名词放在词尾,以提升辨识度。
// 【强制】在 long 或者 Long 赋值时,数值后使用大写字母 L,不能是小写字母 l,小写容易跟数字混淆,造成误解。
// 在类中删除未使用的任何字段、方法、内部类;在方法中删除未使用的任何参数声明与内部变量。
public String orderName;
public Integer orderType;
public Long orderCount;
public Boolean canDelete;
// 【推荐】当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读,此条规则优先于下一条。
// 【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。
public OrderVO() { }
public OrderVO(String orderName) {
this.orderName = orderName;
}
public OrderVO(String orderName, int orderType) {
this.orderName = orderName;
this.orderType = orderType;
}
// 【强制】禁止在 POJO 类中,同时存在对应属性 xxx 的 isXxx()和 getXxx()方法
public String getOrderName() {
return orderName;
}
// 【推荐】setter 方法中,参数名称与类成员变量名称一致,this.成员名 = 参数名。
public void setOrderName(String orderName) {
// if (!orderName.isEmpty())
// orderName = orderName + " pass";// 在 getter/setter 方法中,不要增加业务逻辑,增加排查问题的难度。
this.orderName = orderName;
}
public Integer getOrderType() {
return orderType;
}
public void setOrderType(Integer orderType) {
this.orderType = orderType;
}
public Long getOrderCount() {
return orderCount;
}
public void setOrderCount(Long orderCount) {
this.orderCount = orderCount;
}
public Boolean isCanDelete() {
return canDelete;
}
public void setCanDelete(Boolean canDelete) {
this.canDelete = canDelete;
}
// 【强制】单行字符数限制不超过 120 个,超出需要换行。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof OrderVO)) return false;
OrderVO orderVO = (OrderVO) o;
return getOrderName().equals(orderVO.getOrderName())
&& getOrderType().equals(orderVO.getOrderType())
&& getOrderCount().equals(orderVO.getOrderCount())
&& canDelete.equals(orderVO.canDelete);
}
// 【强制】所有的覆写方法,必须加@Override 注解。
@Override
public int hashCode() {
return Objects.hash(getOrderName(), getOrderType(), getOrderCount(), canDelete);
}
// 【强制】POJO 类必须写 toString 方法,当抛出异常时,可打印其属性值,便于排查问题。
@Override
public String toString() {
return "OrderVO{" +
"orderName='" + orderName + '\'' +
", orderType=" + orderType +
", orderCount=" + orderCount +
", canDelete=" + canDelete +
'}';
}
}
在VO类的代码里,将相关的规范已经罗列,对比后发现有几处需要注意或者纠正:(标记红色的是之前的坏习惯,今后编码注意纠正~)
- 【强制】所有的类都必须添加创建者和创建日期。
---> 使用IDEA话,可以在类注释格式中添加这两个。
- 【强制】类、类属性、类方法的注释必须使用 Javadoc 规范,使用格式,不得使用// xxx 方式。
---> 实际编程中对类的方法,属性注释已经习惯了使用//方式,这个需要纠正!!!JDK源码均是Javadoc 规范,可参考此。
- 【参考】在类中删除未使用的任何字段、方法、内部类;在方法中删除未使用的任何参数声明与内部变量。
---> 正常情况下不会出现此类问题,但修改代码时容易造成修改后未删除不再使用的代码。
- 【强制】定义数据对象 DO 类时,属性类型要与数据库字段类型相匹配。
---> DO类是与数据库进行ORM操作时对应的实体类,为了减少失误情况,可利用IDEA自动生成与数据库字段匹配的实体类的功能。
- 【强制】所有的 POJO 类属性必须使用包装数据类型。
---> 实际编程中已经习惯了基本类型与包装类型的混用,这个需要纠正!!!
- 【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。
---> 实际编程中容易使用is开头的命名,如isFinished,isFull,isDeleted等,这个需要纠正!!!定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时 候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。可以用can、weather等。
- 【强制】在 getter/setter 方法中,不要增加业务逻辑,增加排查问题的难度。
---> 在编码的早期容易干些这种事情,增加了代码的复杂度,注意这种现象不要再发生。
- 【强制】POJO 类必须写 toString 方法,当抛出异常时,可打印其属性值,便于排查问题。
---> 实际编程中很少重写toString方法,这个需要格外注意!!!