第八章方法

目录

  • 检查参数有效性
  • 必要时进行防御性拷贝
  • 仔细设计方法签名
  • 明智而审慎地使用重载
  • 明智而审慎地使用可变参数
  • 返回空的数组或集合不要返回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

  • rt

明智而审慎地返回Optional

  • 抛出异常代价很高, null不太好,综合起来Optional
  • 容器类型,包括集合、映射、Stream、数组和Optional,不应该封装在Optional中
  • Optional在本质上类似于检查异常(编译器不要求强制处置的异常如空指针异常),因为它们迫使API的用户面对可能没有返回任何值的事实。抛出未检查的异常或返回null允许用户忽略这种可能性,从而带来潜在的可怕后果
  • 与返回装箱的基本类型相比,返回包含已装箱基本类型的Optional的代价高得惊人,因为Optional有两个装箱级别,而不是零。因此,类库设计人员认为为基本类型int、long和double提供类似Option是合适的。这些Option是OptionalInt、OptionalLong和OptionalDouble。它们包含Optional上的大多数方法,但不是所有方法。因此,除了“次要基本类型(minor primitive types)”Boolean,Byte,Character,Short和Float之外,永远不应该返回装箱的基本类型的Optional
  • 对于性能关键的方法,最好返回null或抛出异常。最后,除了作为返回值之外,不应该在任何其他地方中使用Optional。

为所有已公开的API元素编写文档注释

  • rt

参考文章

  • [Effective Java 读书笔记] 第8章 通用程序设计
  • Effective Java中的方法部分
  • Effective Java 读书笔记(五):Lambda和Stream
  • 使用依赖注入取代硬连接资源
  • Effective Java 笔记
  • Effective Java (类和接口)

你可能感兴趣的:(第八章方法)