effective java笔记
条评论effective 笔记
一、创建和销毁对象
1.用静态工厂方法代替构造方法
2.多个构造参数时,考虑构造器
3.用枚举实现单例
4.用私有的构造方法,强化不可实例化的能力
5.避免创造不必要的对象
6.消除过期对象的引用
7.避免使用终结的方法
不应该依赖终结方法来更新重要 的持久状态
二、所有对象都通用的方法
1.equals :1)自反性 2)对称性 3)传递性 4) 一致性
- 使用 == 操作符检查 “参数是否为这个对象的引用”
2.使用instanceof 操作符检查 “参数是否为正确的类型
3.把参数转换成正确的类型。
4.对于该类中,的每个“关键” 域,检查参数中的域是否与该对象中的对应的域匹配
Float / Double 浮点数的比较 ,用 compare
Arrays.equals
覆盖equals 方法时,总要覆盖hashCode
始终要覆盖toString
谨慎的覆盖clone
考虑实现Comparable
三、类和接口
1.使类和成员的可访问性最小化 private package(default) protected public
数据是可变的,安全漏洞中,最长常见的根源
2.在公有类中使用访问方法,而非公有域 公有类不应该暴露数据域
3.使可变性最小化
1)不要提供任何可修改对象状态的方法 (mutator)
2)保证类不会被扩展
3)使所有的域都的final的
4)使所有的域方法都是私有的
5)确保对于任何可变组件的互斥访问。
4.在公有类中使用访问方法而非公有域
5.使可变性最小化
使类成为不可变,要遵循下面五条规则:1)不要提供任何会修改对象状态的方法 2)保证类不会被扩展 3)使所有的域都是final的 4)使所有的域都是私有的 5)确保对于任何可变组件的互斥访问。
6.复合优先于继承
7.要么为继承为设计,并提供文档说明,要么就禁止继承
好的API 文档应该描述一个给定的方法做了什么工作,而不是描述它是如何工作的。
1) 类必须通过某种形式提供适当的钩子(hook),以便能够进入它的内部工作流程中,这种形式可以是精心选择的受保护(protected)的方法
2) 构造器决不能调用会被覆盖的方法
3)无论是clone还是readObject方法,都不可以调用可覆盖的方法
8.接口只用于定义类型
静态导入机制
接口应该只被用来定类型,而不应该用来到处常量
9.类层次优于标签类
10.用函数对象表示策略
函数对象:定义这样一种对象,它的方法执行其他对象(这些对象被显示传递给这些方法)上的操作,如果一个类,仅仅导出这样的一个方法,他的实例实际上就等同于一个指向该方法的指针。这样的的实例被称为函数对象。
函数指针的主要用途就是实现策略(Strategy)模式,为了在java中实现这种模式,要声明一个接口来表示该策略,并且为没具体的策略声明一个实现了该接口的的类,当一个具体的策略只能被使用一次时,通常使用使用匿名类来声明和实例化这个具体的策略类,当一个具体策略是设计用来重复使用的时候,他的类通常就要被实现为私有的的静态成员类,并通过公有的的静态final域被导出,其类型为该策略接口。
11.优先考虑静态成员类
嵌套类有4种:1) 静态成员类,非静态成员类,匿名类,和局部类
四、 泛型
1.请不要在新代码中,使用原生类型
2.消除非受检警告
3.列表优先于数组
1) Object[] objectArray = new Long[1]; objectArray[0] = “I don’t fit in”; 运行时报错
List
7.优先考虑类型安全的异构容器
当一个类的字面文字被用在方法中,来传达编译时的和运行时的类型信息时,被称作 type token