检查参数的有效性
- 使用Objects.requireNonNull方法来检查是否是null
- 每当编写方法或者构造器的时候,应该考虑它的参数有哪些限制,应该把这些限制写到文档中,并且在这个方法体的开头处,通过显示的检查来实施这些限制
必要时进行保护性拷贝
-
Data已经过时了,不应该在新代码中使用(new Data())
-
对于构造器的每一个可变参数进行保护性拷贝,例如:
package codeTemplate.effectiveJava.task; import codeTemplate.effectiveJava.service.BasicService; public class BasicTask implements Runnable{ private final BasicService basicService; public BasicTask(BasicService basicService) { this.basicService = basicService; } @Override public void run() { } }
-
保护性拷贝是在检查参数的有效性之前进行的,并且有效性检查是针对拷贝之后的对象,而不是针对原始的对象
谨慎设计方法签名
-
谨慎地选择方法的名称
-
不要过于追求遍历的方法
-
避免过长的参数列表,相同类型的长参数小序列格外有害
-
缩短过长参数列表的三个方法:1、把一个方法分解成多个方法,2、创建辅助类,3、从对象构建到方法调用都采用Builder模式
-
对于参数类型,要优先 使用接口而不是类,只要有适当的接口可用来定义参数与,就优先使用这个接口,而不是使用实现这个接口的类
-
对于boolean类型,要优先使用两个元素的枚举类型
public enum Sex{BOY,GIRL}
慎用重载
- 要调用哪个重载方法是在编译时做出决定的
- 永远不要导出两个具有相同参数数目的重载方法
- 你始终可以给方法起不同的名称,而不是重载机制
- 至少应该避免这样的情形,同一组参数只需要经过类型转换就可以传递给不同的重载方法
慎用可变参数
-
可变参数可以接受0个或者多个指定类型的参数,可变参数的机制是首先创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到数组中,最后将数组传递给方法
public static void aaa(String... args) { System.out.println(args); } aaa("123","345","3535"); [Ljava.lang.String;@4e50df2e
-
在定义参数数目不定的方法时,可变参数方法是一种很方便的方式。在使用可变参数之前,要先包含所有必要的参数,并且要关注使用可变参数所带来的性能影响
返回零长度的数组或者集合,而不是null
- 永远不要返回null
- 返回空Collection,Collections.emptyList,Collections.emptySet,Collections.emptyMap,
谨慎返回optional
- 永远不要通过返回Optional的方法返回null
- 容器类型包括集合、映射、Stream、数组和optional,都不应该包装在optional中
- 永远不要返回基本包装类型的optional
- 几乎永远不适合用optional作为键、值,或者集合或数组中的元素
- 如果无法返回结果并且当没有返回结果时客户端必须执行特殊的处理,那么就应该声明该方法返回Optional
为所有导出的API元素编写文档注释
- Javadoc利用特殊格式的文档注释,根据源代码自动产生API文档
- 为了正确编写API文档,必须在每个被导出的类、接口、构造器、方法和域声明之前增加一个文档注释
- 方法的文档注释应该简洁地描述出他和客户端之间的约定
- 同一个类或者接口中的两个成员或者构造器,不应该具有相同的概要描述
- 当为泛型或者方法编写文档时,确保要在文档中说明所有的类型参数
- 为注解类型编写文档时,要确保在文档中说明所有成员,以及类型本身
- 类或者静态方法是否是线程安全,应该在文档中对它的线程安全级别进行说明
- 阅读有Javadoc工具生成的网页