《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常亮。

原文地址:https://www.cnblogs.com/vectorli/p/5401258.html