《Effective Java》要点总结
对象创建和销毁
1. 用静态工厂方法代替构造器。
2.遇到多个参数构造器时考虑用构建器。
3.用私有构造器或枚举型强化Singleton。
推荐使用枚举型,可以避免拷贝和重复创建的问题。
4.通过私有构造器强化不可实例化的能力。
5.避免创建不必要的对象。
尽量使用String str = "XXX";而不是String str = new String("XXX");
6.消除过期的对象引用。
7.避免使用终结方法。
终结方法的何时被调用或是否被调用是不确定的。
对于所有对象通用的方法
8.覆盖equals是要遵守通用规定。
需要遵守自反性、对称性、传递性、一致性、非空性(x.equals(null)返回false)。
Java库中的Timestamp对Date进行了扩展,增加了nanoseconds域,equals实现违反了对称性。不能将Timestamp和Date用于同一个集合中,会引起不正确的行为。
提高equals的诀窍:a.使用==操作检查参数是否为这个对象的引用,如果比较操作可能很昂贵就值得这么做。b.使用instanceof操作检查参数是否为正确类型。c.把参数转换为正确的类型。d.覆盖equals是总要覆盖hashCode。e.不要企图让equals方法过于智能。f.不要将equals声明中的Object对象替换为其他类型。
9.覆盖equals时总要覆盖hashCode。
10.始终覆盖toString。
11.谨慎地覆盖clone。
12.考虑实现Comparable接口。
Comparable的限制类似equals。compareTo的结果和equals的结果可能不一致。
类和接口
13.使类和成员的可访问性最小化。
14.在公有类中使用访问方法而非公有域。
15.使可变性最小化。
16.复合优先于继承。
17.要么为继承而设计,并提供文档说明,要么就禁止继承。
18.接口优于抽象类。
19.接口只用于定义类型。
20.类层次由于标签类。
标签类会造成代码和逻辑上的不清晰。
21.用函数对象表示策略。
22.优先考虑静态成员类。
泛型
23.不要在新代码中使用原生态类型。
24.消除非受检警告。
25.列表优于数组。
26.优先考虑泛型。
在需要消除警告时,尽可能的在小的范围内消除警告。
27.优先考虑泛型方法。
28.利用有限制通配符来提升API的灵活性。
主要是通过?, 例如List<? extends T>。
29.优先考虑类型安全的异构容器。
枚举和注解
30.用enum代替int常亮。