effective java(7)-方法

第38条 检查参数有效性

  对于开放方法,使用exception

  对于私有方法,可以使用assert

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

  在与对外接口交互过程中,确保接收或返回的对象是不可变的。

  对于赋值时传入的对象,可以把关键信息重新赋值给新对象,防止外部对该对象进行修改时随之改变

  对于使用get访问一个对象时,为了防止拿到对象的类对其进行修改,可以把关键信息放在一个新对象里并返回(与创建试图思想一致)进行保护性拷贝会造成性能损失,对于同一个项目里,只在内部用到的类,只需确保编码时不会对其用到的参数类进行修改即可,对于与外界交互的类,需要注意该条建议

第40条 谨慎设计方法签名

  1. 方法名称符合规范
  2. 避免过长参数列表,4个为最佳。多于4个可以采取分解方法、创建辅助类(抽象公共实体代替多个字段)、使用建造者模式
  3. 参数类型优先使用接口,如传入Map,而不是HashMap。(与面向接口编程思想契合)

第41条 慎用重载

  重点:重载方法的选择时静态的,被覆盖的方法的选择是动态的。

  解释:重载方法是根据编译后的类型进行方法查找的,而被覆盖的方法是根据具体类型查找待执行方法的。

  表现:当有多个重载方法,每个方法参数类型又有公共接口的时候,只会执行传入公共接口的方法;当有多个子类重写父类方法时,会执行具体子类中的方法,而不会执行父类的方法。

  安全保守的原则:不要编写两个具有相同参数数目的重载方法,如果必须那就给出不同的名字。

重载的好例子

1
2
3
4
5
6
7
8
9
10
11
12
Set<Integer> set = new TreeSet<>();
List<Integer> list = new ArrayList<>();
for (int i = -3; i < 3; i++) {
set.add(i);
list.add(i);
}
for (int i = 0; i < 3; i++) {
set.remove(i);
list.remove(i);
}
System.out.println(set);
System.out.println(list);

输出:[-3,-2,-1]
[-2,0,2]

1
2
3
4
5
6
7
8
9
10
11
12
Set<Integer> set = new TreeSet<>();
List<Integer> list = new ArrayList<>();
for (int i = -3; i < 3; i++) {
set.add(i);
list.add(i);
}
for (int i = 0; i < 3; i++) {
set.remove(i);
list.remove((Integer)i);
}
System.out.println(set);
System.out.println(list);

输出:[-3,-2,-1]
[-3,-2,-1]

java加入泛型和自动装箱后,破坏了List接口

第42条 慎用可变长参数

可变长参数是为prinf函数设计的
  可变长参数方法的每次调用都会导致进行一次数组分配和初始化,造成一定性能损耗。
  方案:确定对某个方法95%的调用,会有3个或者更少的参数,就声明5个重载方法,每个方法有0到3个普通参数,多余3个参数使用一个可变长参数

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

返回数组时:

1
2
3
4
List<Object> list = new ArrayList<>();
Object[] a = new Object[0];
Object[] tes = list.toArray(a);
//即使list有值,abstractCollection中的toArray方法也会重新产生一个数组放list中的数据

返回集合时

1
2
if(list.isEmpty())
return Collections.emptyList();

第44条 写文档

自觉吧。。。。

-------------本文结束感谢您的阅读-------------

本文标题:effective java(7)-方法

文章作者:小建儿

发布时间:2018年05月06日 - 13:05

最后更新:2018年11月17日 - 18:11

原始链接:http://yajian.github.io/effective-java-7-方法/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。