美文网首页
第八章方法

第八章方法

作者: 后来丶_a24d | 来源:发表于2020-03-11 10:51 被阅读0次

    目录

    • 检查参数有效性
    • 必要时进行防御性拷贝
    • 仔细设计方法签名
    • 明智而审慎地使用重载
    • 明智而审慎地使用可变参数
    • 返回空的数组或集合不要返回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<T>是合适的。这些Option是OptionalInt、OptionalLong和OptionalDouble。它们包含Optional<T>上的大多数方法,但不是所有方法。因此,除了“次要基本类型(minor primitive types)”Boolean,Byte,Character,Short和Float之外,永远不应该返回装箱的基本类型的Optional
    • 对于性能关键的方法,最好返回null或抛出异常。最后,除了作为返回值之外,不应该在任何其他地方中使用Optional。

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

    • rt

    参考文章

    相关文章

      网友评论

          本文标题:第八章方法

          本文链接:https://www.haomeiwen.com/subject/kchqjhtx.html