zoukankan      html  css  js  c++  java
  • 《Effective Java 2nd》第7章 方法

    目录

    关注点:可用性、健壮性、灵活性

    第38条 检查参数的有效性

    在编写方法或者构造器的时候,应该考虑参数有哪些限制,并显式检查

    第39条 必要时进行保护性拷贝

    如果类具有从客户端得到或者返回到客户端的可变组件,为了维持不可变性,必要时进行保护性拷贝。

    否则,在文档中写明,不可修改此组件。

    举例:

    public final class Period {
       private final Date start;
       private final Date end;
       public Period(Date start, Date end) {
          if (start.compareTo(end) > 0) {
             throw new IllegalArgumentException(strat + "after" + end);
          }
          this.start = start;
          this.end = end;
       }
       public Date start() {
          return start;
       }
       public Date end() {
          return end;
       }
    }

    Period表示一段不可变的时间周期。

    但是,Period并不是不可变的!!!因为Date是可变的。

    Date start = new Date();
    Date end = new Date();
    Period p = new Period(strat, end);
    end.setYear(78);//因为Date是可变的,导致p被修改了

    解决方法:

    public Period(Date start, Date end) {
          //先进行保护性拷贝,然后再对拷贝后的进行检查
          this.start = new Date(start.getTime()); //使用保护性拷贝
          this.end = new Date(end.getTime()); //使用保护性拷贝
          if (this.start.compareTo(this.end) > 0) {
             throw new IllegalArgumentException(strat + "after" + end);
          }
       }

    Period仍旧是可以被改变的。

    Date start = new Date();
    Date end = new Date();
    Period p = new Period(strat, end);
    p.end().setYear(78);//因为Date是可变的,导致p被修改了

    解决方法:

       public Date start() {
          return new Date(start.getTime());
       }
       public Date end() {
          return new Date(end.getTime());
       }

    第40条 谨慎设计方法签名

    1.避免过长的参数列表。4个参数,或者更少。

    不要定义相同类型的长参数序列,容易不小心弄错了参数顺序。

    如何缩短过长参数列表?

    1)拆分成多个方法

    2)创建辅助类,保存参数的分组。

    3)采用Builder模式。在方法带有多个参数,且有些是可选参数的时候,这个方法尤其有用!

    2.对于参数类型,优先使用接口而不是类。

    3.对于boolean类型,优先使用两个元素的枚举类型

    第41条 慎用重载

    为何慎用重载?

    因为在特殊情形(类型转换、自动装箱拆箱等)下,很难确定到底哪个重载方法会被调用。

    建议

    1) 对于多个有相同参数数目的方法来说,应尽量避免重载。

    2)要避免这种情况:同一组参数只需经过类型转换就能传递给不同的重载方法。

    举例:m(List<?> s),m(Set<?> s),m(Collection<?> s)。

    第42条 慎用可变参数

    在重视性能情况下,使用可变参数要小心。可变参数的每次调用都会导致一次数组分配和初始化。

    如何改进?当确定95%的调用有3个或更少的参数时,定义5个重载方法。

    m()

    m(int a)

    m(int a, int b)

    m(int a, int b, int c)

    m(int a, int b, int c, int ....rest)

    第43条 返回零长度的数组或集合,而不是null

    对于返回类型为数组或集合的方法返回一个零长度的数组或者集合,而不是返回null。

    第44条 为所有导出的API元素编写文档注释

  • 相关阅读:
    celery定时器
    基于Django的Rest Framework框架的视图组件
    Django的缓存机制
    Django中的跨域请求问题
    基于Django的Rest Framework框架的url控制器
    基于Django的Rest Framework框架的响应器
    基于Django的Rest Framework框架的分页组件
    基于Django的Rest Framework框架的解析器
    虚拟机下CentOS7开启SSH连接
    Vue中computed和watch的区别
  • 原文地址:https://www.cnblogs.com/yeyang/p/10489079.html
Copyright © 2011-2022 走看看