effective java 读书笔记---第7章 方法

来源:互联网 发布:加内特2004季后赛数据 编辑:程序博客网 时间:2024/06/06 20:54

38.检查参数的有效性
需要在方法入口处检查参数有效性
对于公有方法,需要使用@throws 标签说明违反参数值限制时抛出的异常
对于 private 方法可以使用断言(assertion)来检查它们的参数例子:

 private static void method(int i)    {        assert i > 0;        System.out.println(i);    }

注意默认情况系 java 是不开启断言检查的,因此正常情况下,以上代码即使传入-1,也不会终止运行,除非你手动使用-enableassertions或-ea 来开启断言
方法与构造器参数的限制应该写在文档中,并且在方法的开头处使用显示的检查来实施这个限制

39.必要时进行保护性拷贝
在设计不可变类时,如果引用了可变的域,在初始化这些域是使用保护性拷贝

public class DateTest{    private final Date date;    public DateTest(Date date)    {        this.date = new Date(date.getTime());    }

注意保护性拷贝需要在检查参数有效性之前进行,并且有效性检查需要针对拷贝后的对象,这样可以避免在危险阶段从例外一个线程改变类的参数
对于参数类型可以被不可信任方子类化的参数,请不要使用 clone 方法来进行保护性拷贝
对于 date 的访问方法也需要使用保护性拷贝来进行访问
如果允许客户提供的对象进入到内部数据结构中,则需要考虑客户提供的对象是否有可能是可变的.如果是,就需要考虑你的类是否能容忍对象进入数据结构之后发生变化,如果答案是否定的,就需要对该对象进行保护性拷贝
通常设计不可变类时应该优先考虑使用不可变对象,例如例子中的程序,可以考虑保存 date.getTime()的long 对象进行保存,此时就不必担心保护性拷贝的问题

40.谨慎设计方法签名
谨慎的选择方法名称
不要过于追求提供便利的方法
避免过长的方法列表,最好不超过四个参数
对于参数类型,优先使用接口,而不是实现这个接口的类
对于 boolean 类型,优先使用两个元素的枚举类

41.慎用重载
重载方法的调用与覆盖方法的调用不同,覆盖方法的调用在运行时会根据对象的实际类型决定调用哪种方法,重载在编译时已经确定调用哪种方法(不会根据运行时的对象类型选择调用方法)
安全的重载策略是,永远不要导出两个具有相同参数数目的重载方法,如果方法使用可变参,保守的方法是不去重载
对于构造器重载,可以优先考虑静态工厂
考虑List<Integer> list = ... ;list.remove(1) remove(Object) remove(index) 会直接调用 remove(index)方法,除非存入参数 Integer 类型

42.慎用可变参数

43.返回零长度的数组或者集合,而不是 null
返回类型为数组或者集合的方法没有理由返回 null

44.为所有导出 api 元素编写文档注释

0 0