第38条 检查参数有效性
对于开放方法,使用exception
对于私有方法,可以使用assert
第39条 必要时进行保护性拷贝
在与对外接口交互过程中,确保接收或返回的对象是不可变的。
对于赋值时传入的对象,可以把关键信息重新赋值给新对象,防止外部对该对象进行修改时随之改变
对于使用get访问一个对象时,为了防止拿到对象的类对其进行修改,可以把关键信息放在一个新对象里并返回(与创建试图思想一致)进行保护性拷贝会造成性能损失,对于同一个项目里,只在内部用到的类,只需确保编码时不会对其用到的参数类进行修改即可,对于与外界交互的类,需要注意该条建议
第40条 谨慎设计方法签名
- 方法名称符合规范
- 避免过长参数列表,4个为最佳。多于4个可以采取分解方法、创建辅助类(抽象公共实体代替多个字段)、使用建造者模式
- 参数类型优先使用接口,如传入Map,而不是HashMap。(与面向接口编程思想契合)
第41条 慎用重载
重点:重载方法的选择时静态的,被覆盖的方法的选择是动态的。
解释:重载方法是根据编译后的类型进行方法查找的,而被覆盖的方法是根据具体类型查找待执行方法的。
表现:当有多个重载方法,每个方法参数类型又有公共接口的时候,只会执行传入公共接口的方法;当有多个子类重写父类方法时,会执行具体子类中的方法,而不会执行父类的方法。
安全保守的原则:不要编写两个具有相同参数数目的重载方法,如果必须那就给出不同的名字。
重载的好例子
1 | Set<Integer> set = new TreeSet<>(); |
输出:[-3,-2,-1]
[-2,0,2]
1 | Set<Integer> set = new TreeSet<>(); |
输出:[-3,-2,-1]
[-3,-2,-1]
java加入泛型和自动装箱后,破坏了List接口
第42条 慎用可变长参数
可变长参数是为prinf函数设计的
可变长参数方法的每次调用都会导致进行一次数组分配和初始化,造成一定性能损耗。
方案:确定对某个方法95%的调用,会有3个或者更少的参数,就声明5个重载方法,每个方法有0到3个普通参数,多余3个参数使用一个可变长参数
返回零长度的数组或者集合,而不是null
返回数组时:
1 | List<Object> list = new ArrayList<>(); |
返回集合时
1 | if(list.isEmpty()) |
第44条 写文档
自觉吧。。。。