Effective Java笔记-第7章:方法

来源:互联网 发布:windows dream scence 编辑:程序博客网 时间:2024/06/05 10:38

本章主要讨论的:方法的设计原则:可用性,健壮性,灵活性,尽可能通用,并符合实际的需要

1. 如何处理参数和返回值

2. 如何设计方法签名

3. 如何为方法编写文档

4. 以上三点,适用于普通方法,也适用于构造器


第38条:检查参数的有效性

1. 原则:错误发生之后,应该尽快检测出错误

2. 参数无效,非法,错误,会导致:产生不确定的错误,很难检测出来。[程序执行了很长时间了,结果难以预料,错误悄悄的发生]

3. 对参数,一般都有限制。普通方法:参数限制,如:index >= 0,Object != null。   构造器:类的实例有约束条件,参数合法性的检测更需要

4. 适当使用assert,可以简化 “对参数合法性的验证复杂度” 

5. 一般情况下:执行计算任务之前,应该先检查参数。

6. 有例外情况:1. 参数检查代价昂贵   2. 参数检查是不可能的  3. 参数有效性隐含在计算过程中:如:比较List中的Object,Object不可以被比较的话,会抛出异常

7. 以doc为准:抛出的异常和doc描述不一致,需要做:异常转译[见第61条]

8. 检验参数合法性,有效性的:1. 通过assert  2. 抛出异常  3. 方法的执行结果,体现在返回值上[参数不合法,返回false,但是如果方法太长的话,可能不太合适]

9. 总结:要养成习惯做参数合法性,有效性的检验。成功一次,就算是赚了!


第39条:必要时候进行保护性copy


第40条:谨慎设计方法签名

1. 方法的名称:遵循标准的命名习惯(见第56条)。[总之:易于理解就行了]

2. 不要追求提供过于便利的方法:方法太多会导致学习,文档化,测试,使用,维护难度增加。应该是:提供基本API,让使用者组合使用。如果某一项操作特别频繁,那么才有必要提供一个快捷方法

3. 参数不能太多:上限是4个

4. 缩短参数列表的方法:

4.1 一个方法分解成多个方法,每个方法仅仅需要方法列表的子集。功能上:多个方法组合等同于那一个参数列表很长的方法

4.2 创建辅助类:就是把多个参数封装到一个辅助类,把类的实例作为方法参数。

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

6. 合理使用枚举:让程序更优雅。

例子:对于boolean参数,优先使用两个元素的枚举类型

//Fahrenheit:华氏温度      Celsius:摄氏温度    thermometer:温度计

public enum TemperatureScale {FAHRENHEIT,CELSIUS}

Thermometer.newInstance( TemperatureScale.CELSIUS ) 比Thermometer.newInstance(true) 更合理

想起了JD AppStore那个项目中,网络请求就是酱紫


第41条:慎用重载




classify方法的替代:

public static String classify(Collection<?> c){

return c instanceof Set ? "Set" :

   c instanceof List ? "List" :

  "Unkonwn";

}

1. 调用被重载(overload)方法:在编译时做出决定,静态的[编译时候:参数类型是Collection,所以调用 classify(Collection<?> s) ]

2. 调用被覆盖[子类覆盖父类方法](override)方法:在运行时做出决定,动态的[多态:运行时候,调用实际类型(对象的运行时类型,一般是子类)的方法]

    调用被覆盖的方法的时候,“ 最为具体的那个方法将被执行 ”

3. 下面情况下API可能导致错误:用户不能明确知道:“ 对于一组给定的参数,其中哪个重载方法会被调用”

4. 避免胡乱使用重载机制:尤其是参数列表类似,甚至难以区分的情况下

5. 可变参数的方法:应当采用保守策略:不要重载此方法

6. 好的例子:ObjectOutputStream中的方法:writeInt(int),writeLong(long),readInt(),readLong();用户对API不会产生歧义

7. 预防措施:如果参数个数相同,参数列表中某个参数,类型完全不同[不能互相转化]

8. 特殊情况:自动装箱,自动拆箱:导致编译时候,参数是 int 还是 Integer 无法判断。例子:List<E>接口有两个重载的remove方法:remove(E) 和 remove(int)。x=1, Set.remove(x) 调用的是 remove(int),如果x= -1,Set.remove(x) 调用的是 remove(Integer)

9. 总结:

9.1 能够重载此方法,并不意味着:应该重载此方法

9.2 小心:自动装箱,自动拆箱

9.3 如果参数列表非常类似:应该保证:其中至少有一个参数的类型是 “ 完全不同的 ”


第42条:慎用可变参数











 

0 0
原创粉丝点击