目录
- 检查参数有效性
- 必要时进行防御性拷贝
- 仔细设计方法签名
- 明智而审慎地使用重载
- 明智而审慎地使用可变参数
- 返回空的数组或集合不要返回null
- 明智而审慎地返回Optional
- 为所有已公开的API元素编写文档注释
方法
检查参数的有效性
- 非公有方法应使用断言(Assertion)来检查它们的参数,公有方法需要在Javadoc中标明一旦参数违反限制时,会抛出什么异常。但并不是说对参数的任何限制都是好事,应当在通用的原则,遵循上面的指导原则。
必要时必须进行保护性拷贝(创建不可变类时需要)
- 乍一看好像Period是不可变的,实际上,只是start和end不能指向新的引用,但是,可以通过底下代码改变。,、这样来改变p中的start和end,如果Period中的接口开放给客户端,则可以随意修改开始和结束的时间,这显然不是我们想要的,于是可以利用保护性拷贝解决该问题:
public final class Period {
private final Date start;
private final Date end;
public Period(Date start, Date end) {
if(start.compareTo(end) > 9)
throw new IllegalArgumentException(start + " after " + end);
this.start = start;
this.end = end;
}
public Date start() {
return start;
}
public Date end() {
return end;
}
}
//修正
public final class Period {
private final Date start;
private final Date end;
public Period(Date start, Date end) {
this.start = new Date(start.getTime());
this.end = new Date(end.getTime());
if(start.compareTo(end) > 9)
throw new IllegalArgumentException(start + " after " + end);
}
public Date start() {
return new Date(start.getTime());
}
public Date end() {
return new Date(end.getTime());
}
}
- 至于为什么不用clone()方法,书中也写的很详细了,Date不是final类,也就是说它可以被继承而修改,如果有人恶意继承Date,将引用记录到一个私有的静态列表中,这种子类便是不可信的,如果当作参数传入Period的构造方法中,如果使用clone()方法进行拷贝,则拷贝的是这种不可信子类,还是会使Period变得很脆弱,这里使用java.util.Date类避免了这一情况。
- clone要注意是深复制还是浅复制
慎用可变参数、重载,谨慎设计方法签名
- 原则为:参数不能过多,方法不宜过多,方法名应该清晰明了,参数类型优先使用接口而不是类。慎用重载和可变参数,因为这样会使方法变得模糊,客户端在调用方法后所得到的结果往往出乎意料
返回长度为零的数组或者集合而不是null
明智而审慎地返回Optional
- 抛出异常代价很高, null不太好,综合起来Optional
- 容器类型,包括集合、映射、Stream、数组和Optional,不应该封装在Optional中
- Optional在本质上类似于检查异常(编译器不要求强制处置的异常如空指针异常),因为它们迫使API的用户面对可能没有返回任何值的事实。抛出未检查的异常或返回null允许用户忽略这种可能性,从而带来潜在的可怕后果
- 与返回装箱的基本类型相比,返回包含已装箱基本类型的Optional的代价高得惊人,因为Optional有两个装箱级别,而不是零。因此,类库设计人员认为为基本类型int、long和double提供类似Option<T>是合适的。这些Option是OptionalInt、OptionalLong和OptionalDouble。它们包含Optional<T>上的大多数方法,但不是所有方法。因此,除了“次要基本类型(minor primitive types)”Boolean,Byte,Character,Short和Float之外,永远不应该返回装箱的基本类型的Optional
- 对于性能关键的方法,最好返回null或抛出异常。最后,除了作为返回值之外,不应该在任何其他地方中使用Optional。
为所有已公开的API元素编写文档注释
参考文章
网友评论