《Effective Java》学习笔记上

2017-04-25  本文已影响0人  QM

第2章 创建和销毁对象

第1条:考虑用静态工厂方法代替构造方法

静态工厂方法与构造方法的不同

优点:

缺点:

第2条:遇到多个构造器参数时要考虑用构造器

与构造器相比,builder可以有多个可变的参数。builder模式十分灵活,可以利用单个builder构造多个对象。总之,如果类的构造器和静态工厂中具有多个参数,builder模式就是不错的选择,特别是当大多数参数是可选的时候。

第3条:用私有构造器或者枚举类型强化singleton属性

第4条:用私有构造器强化不可实例化的能力

第5条:避免创建不必要的对象

一般来说,最好能重用对象而不是在每次需要的时候就创建一个相同功能的对象。

第6条:消除过期的对象引用

第7条:避免使用终结方法

第3章 对于所有对象都通用的方法

第8条:覆盖equals时请遵守通用约定

在实现equals方法时,必须遵守的通用约定

实现提高质量equals方法的诀窍

  1. 使用==操作符检查“参数是否为这个对象的引用”。
  2. 使用instanceof操作符检查“参数是否为正确的类型”。
  3. 吧参数转换成正确的类型。
  4. 对于该类中的每个“关键(significant)”域,检查参数中的域是否与该对象中对应的域相匹配。
  5. 当编写完成了equals方法之后,应该问自己三个问题:它是是否对称的,传递的,一致的?
  6. 覆盖equals是总要覆盖hashCode。
  7. 不要企图让equals方法过于智能。
  8. 不要将equals声明中的Object对象替换为其他类型。

第9条 覆盖equals是总要覆盖hashCode

第10条 始终要覆盖toString

第11条 谨慎地覆盖clone

第12条 考虑实现Comparable接口

第4章 类和接口

第13条:是类和成员的可访问性最小化

  1. 私有的(private)
  2. 包级私有的(package-private/default)
  3. 受保护的(protected)
  4. 公有的(public)

第14条:在公有类中使用访问方法而非公有域

第15条:使可变性最小化

不可变类知识其实力不能被修改的类。每个实例中包含的所有信息都必须在创建实例的时候提供,并在对象的整个周期内固定不变。

  1. 不要提供任何会修改对象状态的方法(mutator)
  2. 保证类不会被扩展
  3. 使所有的域都是final的
  4. 使所有的域都成为私有的
  5. 确保对于任何可变组件的互斥访问(如果类具有指向可变的域,则必须确保该类的客户端无法获得指向这些对象的引用)

第16条:复合优先于继承

第17条:要么为继承设计,并提供文档说明,要么就禁止继承

第18条:接口优于抽象类

  1. 现有的类可以很容易被更新,以实现新的接口。
  2. 接口的定义mixin(混合类型)的理想选择。(mixin允许任选的功能可被混合到类型的主要功能中)
  3. 接口允许我们构造非层次结构的类型框架。
  1. 按照惯例,骨架实现被称为AbstractInterface,这里的interface是指所实现的接口的名字。例如AbstractCollection,AbstractSet,AbstractList和AbstractMap等。
  2. 如果设计得当,骨架实现可以使程序员很容易提供他们自己的接口实现。
  3. 骨架实现为抽象类提供了实现上的帮助,但又不强加“抽象类被用作类型定义时”所特有的严格限制。
  4. 骨架实现类仍然能够有助于接口的实现。(模拟多重继承:实现这个接口的类可以把对于接口方法的调用,转发到一个内部私有类的实例上,这个内部私有类扩展了骨架的实现)
  5. 编写骨架实现类相对比较简单,但是有点单调乏味。
  6. 因为骨架实现类是为继承目的实现的,所以应该遵循第17条中介绍的所有关于设计和文档的指导原则。
  7. 骨架实现上有个小小的不同,就是简单实现(simple implementation),AbstractMap的SimpleEntry就是个例子。

第19条:接口只用于定义类型

当类实现接口时,接口就充当可以引用这个类的实例的类型。常亮接口模式是对接口的不良使用。简而言之,接口应该只被用来定义类型,它们不应该被用来导出常亮。

第20条:类层次优于标签类

第21条:用函数对象消失策略

函数指针的主要用途就是实现策略模式。为了在Java中实现这种模式,要声明一个接口来表示该策略,并且为每个具体策略声明一个实现了该接口的类。当一个具体策略只被使用过一次时,通常是使用匿名类来声明和实例化这个具体策略类。当一个具体策略是设计用来重复使用的时候,他的类通常就要被实现为私有的静态成员类,并通过公有的静态final域被导出,其类型为该策略接口。

第22条:优先考虑静态成员类

上一篇下一篇

猜你喜欢

热点阅读