规范化代码
方法参数
方法执行前,最好保证方法参数在预想范围内,否则容易出现未知异常。
检查参数有效性
自定义方法
示例:
if (object != null) {
throw new IllegalArgumentException(message);
}
Assert方法
最后实现一样,检查参数是否为null,不是抛出异常。
Assert.isNull(obj, "param obj is not null");
需要的情况下使用保护性拷贝
异常情况一
public class CopyInstance {
private Date start;
private Date end;
public CopyInstance(Date start, Date end) {
if (start.compareTo(end) > 0) {
throw new IllegalArgumentException("error");
}
this.start = start;
this.end = end;
}
public static void main(String[] args) {
Date start = new Date();
Date end = new Date();
CopyInstance instance = new CopyInstance(start, end);
end.setYear(1971);
}
}
异常情况二
public class CopyInstance {
private Date start;
private Date end;
public CopyInstance(Date start, Date end) {
if (start.compareTo(end) > 0) {
throw new IllegalArgumentException("error");
}
this.start = new Date(start.getTime());
this.end = new Date(end.getTime());
}
public Date getStart() {
return start;
}
public Date getEnd() {
return end;
}
public void setStart(Date start) {
this.start = start;
}
public void setEnd(Date end) {
this.end = end;
}
public static void main(String[] args) {
Date start = new Date();
Date end = new Date();
CopyInstance instance = new CopyInstance(start, end);
instance.getEnd().setYear(1972);
}
}
安全设计
public class CopyInstance {
private Date start;
private Date end;
public CopyInstance(Date start, Date end) {
if (start.compareTo(end) > 0) {
throw new IllegalArgumentException("error");
}
this.start = new Date(start.getTime());
this.end = new Date(end.getTime());
}
public Date getStart() {
return new Date(this.start.getTime());
}
public Date getEnd() {
return new Date(this.end.getTime());
}
public void setStart(Date start) {
this.start = new Date(start.getTime());
}
public void setEnd(Date end) {
this.end = new Date(end.getTime());
}
}
方法签名
慎用重载
永远不要有两个相同参数数量的重载方法,很容易混淆。
慎用可变参数
个人认为:不要使用可变参数,推荐使用数组、列表。
注意
- 谨慎选择方法名称。满足见名知意。
- 不要过于追求提供便利的方法,每个方法专注完成自身工作即可。
- 避免过长的参数列表。有三种技巧可以缩短参数列表:将一个方法分解为多个方法,每个方法需要参数的一个子集即可;创建辅助类,保存参数分组;使用Builder建造器模式。
- 方法参数优先使用接口,而不是具体类。
返回值
返回零长度的数组或集合,而不是null
返回null,调用方法需要检查判断方法返回值,容易出现 NullPointerException 问题。
谨慎返回 Optional
- 永远不要在返回 Optional 的方法中,返回null:违背 Optional本意。
方法注释
正确的开发规范必须在类、接口、构造方法、自定义方法中添加文档注释。
类、接口注释注意
- 对于类、接口来说,概要描述应该是一个名词短语,一个本身代表事物。
构造方法注释注意
- 同一类、接口中的两个成员变量、构造方法,不应该具有相同的概要描述。
- 对于构造方法、自定义方法来说,概要描述应该是一个完整的动词短语(包含任何动对象),一个具体执行的动作。
自定义方法注释注意
- 每一个参数都有一个@param注解。
- 自定义方法的返回值不是void的情况下,需要@return标签。
- 自定义方法抛出的每个异常都需要一个@throws标签。
泛型注释注意
- 文档中说明所有的类型参数。
枚举注释注意
- 为枚举类型编写文档时,需要确保在文档中说明常量、类型、任何共有的方法。