《Effective Java 2nd》第7章 方法

Posted 技术研究

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《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元素编写文档注释

以上是关于《Effective Java 2nd》第7章 方法的主要内容,如果未能解决你的问题,请参考以下文章

《Effective Java》第10章 发并

《Effective Java》第9章 异常

《Effective Java》第5章 泛型

《Effective Java》第6章 枚举和注解

[读书笔记]《Effective Java》第10章并发

《Effective Java》第11章 序列化